如何在 Qt 应用程序中通过终端命令运行分离的应用程序?
Posted
技术标签:
【中文标题】如何在 Qt 应用程序中通过终端命令运行分离的应用程序?【英文标题】:How to run a detached application by terminal command in Qt application? 【发布时间】:2016-04-13 09:22:10 【问题描述】:我想使用命令:
cd /opencv/opencv-3.0.0-alpha/samples/cpp/
./cpp-example-facedetect lena.jpg
在 Qt 应用程序中按钮的 clicked() 方法上运行 OpenCV 的示例代码。 所以我使用:
void MainWindow::on_btSample_clicked()
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("cd /opencv/opencv-3.0.0-alpha/samples/cpp");
process1.waitForBytesWritten();
process2.start("./cpp-example-facedetect lena.jpg");
我添加了必要的库来使用它。但是当我运行我的应用程序时出现错误。
QProcess: Destroyed while process ("./cpp-example-facedetect") is still running.
我该如何解决?如果我的方式不对,请给我另一种方式。提前谢谢你!
【问题讨论】:
尝试使用 process2.waitForFinished(); @Marco 我试过了,但我什么也没得到,没有错误,也没有屏幕显示。 【参考方案1】:我认为你有两个问题:
首先,您的QProcess process2
可能在完成之前就超出了范围(即,由于超出范围而被销毁)。您要么必须等待它完成(使用waitForFinished()
,要么将其设为指针或成员变量(以更改范围)并将finished()
信号连接到某个处理槽(可以进行整理)。
这里的另一件事是,看起来你只是想设置工作目录,所以我不认为将 cd 命令通过管道传输到你的可执行文件中是要走的路,这样做会更容易:
编辑
我已经编辑了我的示例以向您展示如何获取输出:
QProcess myProc;
qDebug() << "Starting process\n";
// Setup the working directory
QDir::setCurrent("D:\\software\\qtTest");
// Start the process (uses new working dir)
myProc.start("test.bat");
myProc.waitForFinished();
qDebug() << myProc.readAll();
我在大约 2 分钟内在我的 windows 机器上敲了这个并为你测试了它......我可以在 linux 上完成它,但这将花费我更长的时间,因为我必须启动它:o......但是如果你愿意,我愿意。
编辑 2
如果你想完全分离进程:
QProcess myProc;
qDebug() << "Starting process\n";
// Setup the working directory
QDir::setCurrent("D:\\software\\qtTest");
// Start the process (uses new working dir)
myProc.startDetached("test.bat");
现在我不能 100% 确定您是否可以从流程中取回输出...现在与您的 Qt 应用程序无关...
【讨论】:
我试过了,但我什么也没得到,没有错误,也没有屏幕显示结果。你有其他方法让它运行吗?谢谢你 我已经编辑了我的示例...我认为它对您有用,但您看不到任何内容可能是因为您没有检索输出?...所以使用 waitForFinished() 然后使用readAll()
读取输出。如果这是一个漫长的过程,那么您可能需要进行不同的设置并等待 readReady() 信号并在它进来时读取输出......再次使用插槽/信号。如果您需要该示例,将需要更长的时间来编写它。
非常感谢。示例代码作为小部件应用程序运行,它会显示图像,但我不知道在我的情况下是否需要检索。我需要的只是运行它而不关心它的结果:D.
哦,但目前我的应用程序在我单击按钮时不显示任何内容 :(。这不是我所期望的 :(
哦,对不起...你是什么意思?你想让它显示什么?我不是 100% 清楚。我编写的代码只会将文本发送到调试...而不是 GUI以上是关于如何在 Qt 应用程序中通过终端命令运行分离的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Tornado 中通过 websocket 传输 .png 或 .jpg 文件
如何使用 JVM 参数在终端中通过 maven 运行 junit 测试