如何在Qt应用程序中通过terminal命令运行分离的应用程序?

时间:2016-04-13 09:22:10

标签: c++ qt opencv qprocess

我想使用命令:

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.

我该如何解决?如果我的方式不对,请给我另一种方式。提前谢谢你!

1 个答案:

答案 0 :(得分:3)

我认为你有两个问题:

首先,你的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分钟内把它撞到了我的窗户盒上并为你测试了......我可以在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应用程序无关......