如何在 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 应用程序中通过终端命令运行分离的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu中通过SuperVisor添加守护进程

如何在 Tornado 中通过 websocket 传输 .png 或 .jpg 文件

在C中通过字符串运行命令

如何使用 JVM 参数在终端中通过 maven 运行 junit 测试

如何在不将其连接到终端的情况下运行“屏幕”,以便可以在 C++ (qt) 应用程序中捕获输出?

如何在Ubuntu中通过编译源码包安装软件Pidgin