使用 QProcess 在 Qt 中运行外部可执行文件

Posted

技术标签:

【中文标题】使用 QProcess 在 Qt 中运行外部可执行文件【英文标题】:Running external executable in Qt using QProcess 【发布时间】:2015-07-02 01:13:47 【问题描述】:

我正在尝试在 Qt 中将外部可执行文件(下面的代码)作为单独的进程运行。

test.c:

#include <stdio.h>
int main () 
    FILE *f;
    f = fopen("a.txt", "w");
    fprintf(f, "1\n");
    fclose(f);
    return 1;

在 Qt 中我有:

QProcess* process = new QProcess();
QString program = "/Users/myUser/Desktop/a.out";
process->execute(program);

我已经阅读了 execute()、start() 和 startDetached() 之间的区别,据我了解,我想使用 execute(),因为我希望运行外部可执行文件的进程在继续执行之前完成主要过程。但是,我已经尝试了所有三个,希望找到一个包含文本“1”的文件 a.txt,但它不存在。关于它为什么不起作用的任何帮助或建议?谢谢!

【问题讨论】:

QProcess::execute 是一个静态函数,因此您不必创建QProcess 的新实例。只是为了澄清-您是否希望调用程序在继续执行之前等待进程完成?您确定可执行文件的路径正确吗?您从哪个目录运行父程序(a.txt 可能在该目录中,如果它与a.out 的目录不同)。 如果进程成功运行,它将在QDir::current() 中创建输出。我很确定你没有在那里寻找输出文件。 @Sam,是的,我希望调用程序仅在子进程完全完成后才继续执行。我只是使用文件系统搜索来查找 a.txt,因为它不在我期望的任何地方。我很欣赏这些建议!非常感谢您提供更多帮助。 在您的测试程序中,尝试写入特定路径(例如 /tmp/a.txt)。 【参考方案1】:

在 main() 函数中检查 a.txt 文件是否确实存在并且在写入之前已打开。

在执行之前检查 Qt 中“程序”文件是否确实存在。

从 main() 函数返回不同的结果代码并在 Qt 中检查结果:

QProcess *proc = new QProcess();

proc->start(program);
proc->waitForFinished();

QString result=proc->readAllStandardOutput();

// Check result here

【讨论】:

当我从命令行独立于 Qt 运行可执行文件时,如果该文件不存在,它可以正常工作并创建 a.txt。只是当我尝试从 Qt 运行它时没有任何反应。你能解释一下为什么你使用proc-&gt;start(program); proc-&gt;waitForFinished(); 而不仅仅是process-&gt;execute(program); 吗?谢谢 示例代码已从我的工作代码中复制。 我认为QProcess::execute 只是为了方便而使用,因此如果您只想运行进程并等待它完成,则不必创建新的QProcess 对象。如果您想阅读流程的输出或做任何更复杂的事情,那么您可以按照@PetriPyöriä 的方式进行。 所以当我尝试你的解决方案时,我从我的程序 QString 中删除了绝对路径......这就是问题所在。你的答案有效。谢谢你们!

以上是关于使用 QProcess 在 Qt 中运行外部可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

使用QT的QProcess执行cmd命令记录

Qt技巧:QProcess与外部程序的调用

使用 qprocess 在 linux 中运行外部应用程序

QT Creator QProcess

从 QThread 启动 QProcess [重复]

Qt QProcess启动和关闭外部程序