我在使用QProcess时遇到了麻烦,我已经查看了几个使用它的位置,但是每次我使用它时我的程序会冻结,或者它只是没有按照我的意愿去做。
我想从GUI应用程序中执行以下操作:
将目录更改为/ Users / Tim / etc等。 从那里我需要调用gnuplot并将脚本加载到其中。
我通常会在终端窗口中执行以下操作:
> cd /Users/Tim/...
> /opt/local/bin/gnuplot barchartscript.txt
目前我正在使用系统调用来执行此操作,这样可行,但是每个人都建议使用QProcess,因此我希望这样做。
我的代码现在如何使用QProcess:
QObject *parent;
QProcess *process = new QProcess(parent);
QString commands;
QString changed = "cd /Users/Tim/etcetc";
commands = (changed + "&& /opt/local/bin/gnuplot scatterplotscriptwithout.txt").c_str();
process->start(commands);
谁能告诉我什么是错的?或者在一个进程中执行多个命令的正确方法?
答案 0 :(得分:5)
此代码段可能有用(未经测试)。有关每种方法的详细信息,请参阅QProcess文档。
process->setWorkingDirectory("/Users/Tim/etcetc");
process->setArguments(QStringList() << "scatterplotscriptwithout.txt");
process->start("/opt/local/bin/gnuplot");
修改强>
程序中出现的另一个错误是您作为QProcess实例的父项提供的未定义指针。设置父级以利用自动子删除很有用。在这种情况下,请注意自己删除QProcess实例。
编辑2(错误处理)
QProcess *process = new QProcess;
connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(handleError(QProcess::ProcessError)));
然后定义一个正确的槽(这里是handleError)
void MyClass::handleError(QProcess::ProcessError error) {
switch(error) {
case QProcess::FailedToStart:
qDebug() << "Failed to start, may be due to insufficient permissions";
break;
case QProcess::Crashed:
qDebug() << "Program crashed.";
break;
//debug each case..
}
}
有关所有枚举值的详细信息,请参阅here。
如果您的QProcess正确结束但未达到预期输出,您可以查看流程的退出代码并参考gnuplot手册页以获取信息。