我想触发一个我在Qt应用程序中生成的c ++二进制文件.这怎么可能 ?在Java中我有类似的东西Runtime.exec().你能告诉我在Qt框架中这是怎么可能的吗?
此外,当我的二进制文件正在运行时,我希望将该程序的输出(现在写入控制台)写入Qt中的文本框.如果我在控制台中以字符串形式写入数据,我可以轻松地执行textbox.setText().所以基本上问题是如何获得程序应该写入控制台的数据,而实际上它是从Qt框架内部运行的.
我知道我可以通过简单地从Qt内部运行和编译我的代码来解决上述问题,但我要问的是因为我正处于服务器时间紧缩和一些差距设计问题的中间.如果这个原因没有漂浮你的船,请把这个问题想象成一个家庭作业问题并帮助我:)
QProcess是你的朋友.
接近一些代码的最小版本的东西,它调用Windows命令解释器并同步等待其输出以获得简单的目录列表,如下所示:
QProcess process;
process.start("cmd.exe",
QStringList() << "/c" << "dir" << "/b",
QIODevice::ReadWrite | QIODevice::Text);
if(!process.waitForFinished()) // beware the timeout default parameter
qDebug() << "executing program failed with exit code" << process.exitCode();
else
qDebug() << QString(process.readAllStandardOutput()).split('\n');
Run Code Online (Sandbox Code Playgroud)
如果你想异步运行它并在Qt-GUI应用程序中获得"在线"结果来更新进度条,那就更有趣了.你会有一个设置部分,例如你的主表单构造函数中的设置部分:
process = new QProcess(this);
connect( process, SIGNAL(readyReadStandardOutput()), SLOT(onStdoutAvailable()) );
connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)) );
Run Code Online (Sandbox Code Playgroud)
也许在按下按钮处理程序调用类似于:
process->start("some_command", QStringList() << "some" << "args",
QIODevice::ReadWrite | QIODevice::Text);
if(!process->waitForStarted())
// some_command failed to even start
Run Code Online (Sandbox Code Playgroud)
然后在onStdoutAvailable()槽内调用process-> readAllStandardOutput()并以某种方式解析它以确定您的进度.最后评估连接的finished()信号的exitCode和exitStatus参数,以确定所有内容是否正常(TM).
如果您希望能够在未经他们同意的情况下停止/终止所有潜在的子进程并且执行该跨平台,它会开始变得有趣......但这显然超出了您的问题的范围.