从Qt内部运行c二进制文件,并将二进制文件的输出重定向到Qt应用程序上的文本框

我想解雇我在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');

如果你想异步运行它并获得’在线’结果可能在Qt-GUI应用程序内更新进度条,它会变得更有趣.你会有一个设置部分,例如在你的主窗体构造函数中的行:

process = new QProcess(this);
connect( process, SIGNAL(readyReadStandardOutput()), SLOT(onStdoutAvailable()) );
connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)) );

也许在按下按钮处理程序调用类似于:

process->start("some_command", QStringList() << "some" << "args",
               QIODevice::ReadWrite | QIODevice::Text);
if(!process->waitForStarted())
    // some_command failed to even start

然后在onStdoutAvailable()插槽中调用process-> readAllStandardOutput()并以某种方式解析它以确定您的进度.最后评估连接的finished()信号的exitCode和exitStatus参数,以确定所有内容是否正常(TM).

如果您希望能够在未经他们同意的情况下停止/终止所有潜在的子进程并且执行该跨平台,它会开始变得有趣……但这显然超出了您的问题的范围.

转载注明原文:从Qt内部运行c二进制文件,并将二进制文件的输出重定向到Qt应用程序上的文本框 - 代码日志