QProcess 执行一个 c++ 文件

Posted

技术标签:

【中文标题】QProcess 执行一个 c++ 文件【英文标题】:QProcess executing a c++ file 【发布时间】:2014-08-31 20:57:23 【问题描述】:

在某些地方,我无法使用 QProcess 运行预构建的 c++ 二进制文件。同时还有其他问题,人们正在使用 QProcess 执行 shell 脚本等,所以我很困惑。我可以使用 QProcess 执行预构建的 c++ 二进制文件吗? 这个二进制文件读取一个文本文件并创建两个文本文件作为回报。 我创建了一个带有 GUI 的基本 UI,并有一个按钮,单击该按钮会调用外部二进制文件。 用execute 运行它会给我一个QIODevice: read: device not open 的错误。当我使用start 时,没有报错。但是也没有创建输出文件。 在 qt 或其他方法中是否允许这样做的任何想法都需要遵循。

void MainWindow::on_startButton_clicked()

QString program = "./home/naveen/sdj";
QProcess *myProcess = new QProcess(this);
myProcess->start(program);
myProcess->waitForFinished();
qDebug() << myProcess->exitStatus();
qDebug() << myProcess->readAllStandardError();
        

【问题讨论】:

【参考方案1】:

首先,QProcess::execute() 是a static method——没有理由创建一个 QProcess 实例来使用它。如果使用 QProcess::start(),它将异步执行进程。您必须先收听finished 信号,然后才能检查返回码。

第二,你确定这是你想要的吗?

QString program = "./home/naveen/sdj";

在 *nix 文件系统中,./ 表示从当前目录开始。所以 QProcess 不会寻找/home/naveen/sdj,而是寻找/yourProjectBuildPath/home/naveen/sdj。我猜这不是你想要的。

【讨论】:

确定不是执行路径,不是构建路径? @Smar 没错,我假设应用程序由 QtCreator 运行的最常见情况。 @MrEricSir,我把它改成了/home/naveen/sdj。虽然仍然没有执行。另外,我如何等待finished。能不能给个提示 在你的类中添加一个槽,并使用connect(myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onProcessFinished(int, QProcess::ExitStatus))); 该方法应该在进程的退出状态下被调用。不过,这只适用于使用 start 方法的情况。如果使用 execute 方法,则应该等待进程完成,[根据文档](qt-project.org/doc/qt-4.7/qprocess.html)。但正如@MrErirSir 所说,您应该使用QProcess::execute(program) 而不是声明一个新对象。

以上是关于QProcess 执行一个 c++ 文件的主要内容,如果未能解决你的问题,请参考以下文章

Qt QProcess

QProcess 附加到从脚本运行的可执行文件

使用 QProcess 在 Qt(C++) 中使用 WinRar 解压缩 - 提取目录问题

使用 QProcess 读取标准输出

我怎么知道 QProcess 何时想要读取输入?

QProcess 终止进程树