当点击一个按钮时,我正试图让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的所有示例我都看过使用/这对我来说没有意义。同样,程序字符串的语法正确,这会有效吗? 感谢
答案 0 :(得分:1)
在C / C ++字符串文字中,您必须转义所有反斜杠。
在Qt中使用waitForX()
函数真的很糟糕。它们会阻止您的GUI并使您的应用程序无响应。从用户体验的角度来看,它真的很糟糕。不要这样做。
您应该使用信号和插槽以异步方式编码。
我的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.
}
...
}