如何使用Qt启动外部进程?

时间:2013-09-22 23:10:18

标签: c++ qt

最终编辑:我在下面编写的代码有效,所以忽略了我写的所有内容。似乎当我将输入文本文件复制到构建目录时,文件在某种程度上被破坏,这导致我的外部可执行文件“prog”中断。很抱歉浪费你的时间,感谢所有试图提供帮助的人!

我刚刚开始搞乱Qt,并有一个名为test_tiny的项目。在我的项目的构建文件夹(可执行的test_tiny所在的位置)中,我移动了另一个名为“prog”的小C ++可执行文件,它从文件读取,执行其操作,并输出到另一个文件。输入文件也在构建目录中。

我还有一个带有几个文本框和几个按钮的窗口。我想通过按下其中一个按钮来运行我的外部程序“prog”。这是我到目前为止所得到的:

void MainWindow::load2() {
    QProcess *process = new QProcess(this);
    process->start("./prog");
    qDebug() << process->exitCode();
    ui->textBrowser_2->clear();
    ui->textBrowser_2->insertPlainText(read(":/File/out.txt"));
}

第二部分工作正常 - 它从out.txt文件中读取并将其加载到文本浏览器中。但是,我的进程似乎没有运行,exitCode()总是返回零(我在“prog”中将它更改为100)。

根据我的理解,QProcess的工作目录(除非另有说明)设置为其构建文件夹,因此调用process->start("./prog");应该有效,但事实并非如此。我也尝试通过引用QResource并提供完整路径来调用它,但无济于事。

任何帮助将不胜感激,谢谢!

我正在使用Qt Creator 2.81基于在x64 Ubuntu 12.04上运行的Qt 5.1.1。

编辑:我忘了提到可执行文件“prog”只解析几行文本并将它们输出到一个文件,然后将其读取并输出到文本框。外部程序“prog”实际上似乎没有运行,我已经尝试使用process->waitForFinished()

2 个答案:

答案 0 :(得分:0)

在检查退出代码之前,您必须等到该过程完成。您可以使用finised()信号或waitForFinished()等待。在waitForFinished成功或发出完成的信号后,检查退出代码是安全的。我几乎总是会使用finshed信号。但是,您还应该确保该过程首先开始。使用error()信号是我检测启动过程是否有问题的方法。 QProcess将使用描述错误的代码发出此信息。 QProcess :: FailedToStart会告诉您应用程序首先没有启动。

答案 1 :(得分:0)

你有两个问题:

  1. 你是否走在正确的道路上?在使用完整路径进行调试时,它可以让生活更轻松。
  2. 您需要调用QProcess :: waitForFinished(LARGE_TIME)或连接到finished()信号,然后才能检查错误(应用程序以异步方式启动)。