4

我想触发从 Qt 应用程序内部生成的 c++ 二进制文件。这怎么可能 ?在 Java 中,我有类似Runtime.exec(). 您能告诉我这在 Qt 框架中是如何实现的吗?

此外,当我的二进制文件正在运行时,我希望将该程序的输出(现在已写入控制台)写入 Qt 中的文本框。如果我有在控制台上以字符串形式写入的数据,我可以轻松地执行 textbox.setText()。所以基本上问题是如何获得程序应该写入控制台的数据,而实际上它是从 Qt 框架内部运行的。

我知道我可以通过简单地从 Qt 内部运行和编译我的代码来解决上述两个问题,但我之所以这么问,是因为我正处于严重的时间紧缩和一些巨大的设计问题之中。如果这个原因没有让你的船浮起来,请把这个问题当作一个家庭作业问题并帮助我:)

4

2 回答 2

7

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()信号的exitCodeexitStatus参数以确定是否一切正常(TM)。

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

于 2013-02-19T23:16:51.957 回答
4

查看 QProcess 及其方法,尤其是 readAllStandardOutput()

于 2013-02-19T15:01:31.497 回答