在另一个程序中启动一个程序

时间:2013-09-05 15:34:29

标签: c++ qt qprocess

当点击一个按钮时,我正试图让Qt启动另一个Qt程序。 这是我的代码。

void Widget::launchModule(){
    QString program = "C:\A2Q1-build-desktop\debug\A2Q1.exe";
    QStringList arguments;
    QProcess *myProcess = new QProcess(this);
    myProcess->start(program, arguments);
    myProcess->waitForFinished();
    QString strOut = myProcess->readAllStandardOutput();


}

所以它应该保存到QString strOut中。首先,我遇到了QString程序行的错误我不明白如何将其指向程序,因为QProcess的所有示例我都看过使用/这对我来说没有意义。同样,程序字符串的语法正确,这会有效吗? 感谢

1 个答案:

答案 0 :(得分:1)

  1. 在C / C ++字符串文字中,您必须转义所有反斜杠。

  2. 在Qt中使用waitForX()函数真的很糟糕。它们会阻止您的GUI并使您的应用程序无响应。从用户体验的角度来看,它真的很糟糕。不要这样做。

  3. 您应该使用信号和插槽以异步方式编码。

    我的other answer提供了一个相当完整的示例,说明异步流程通信可能如何工作。它使用QProcess来启动自己。

    您的原始代码可以修改如下:

    class Window : ... {
        Q_OBJECT
        Q_SLOT void launch() {
            const QString program = "C:\\A2Q1-build-desktop\\debug\\A2Q1.exe";
            QProcess *process = new QProcess(this);
            connect(process, SIGNAL(finished(int)), SLOT(finished()));
            connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(finished()));
            process->start(program);
        }
        Q_SLOT void finished() {
            QScopedPointer<Process> process = qobject_cast<QProcess*>(sender());
            QString out = process->readAllStandardOutput(); 
            // The string will be empty if the process failed to start
            ... /* process the process's output here */
            // The scoped pointer will delete the process at the end 
            // of the current scope - right here.       
        }
        ...
    }