Qt:QProcess调用终端+脚本

Tca*_*chy 2 c++ qt qprocess

我在使用QProcess时遇到了麻烦,我已经查看了几个使用它的位置,但是每次我使用它时我的程序都会冻结,或者它只是没有做我想做的事情.

我想从GUI应用程序做的事情如下:

将目录更改为/ Users/Tim/etc等.从那里我需要调用gnuplot并将脚本加载到其中.

我通常会在终端窗口中执行以下操作:

 > cd /Users/Tim/...        
 > /opt/local/bin/gnuplot barchartscript.txt
Run Code Online (Sandbox Code Playgroud)

目前我正在使用系统调用来执行此操作,这是有效的,但是每个人都建议使用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);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我什么是错的?或者在一个进程中执行多个命令的正确方法?

eps*_*lon 5

此代码段可能很有用(未经测试).有关每种方法的详细信息,请参阅QProcess文档.

process->setWorkingDirectory("/Users/Tim/etcetc");
process->setArguments(QStringList() << "scatterplotscriptwithout.txt");
process->start("/opt/local/bin/gnuplot");
Run Code Online (Sandbox Code Playgroud)

编辑

您的程序中出现的另一个错误是您作为QProcess实例的父级提供的未定义指针.设置父级以利用自动子删除很有用.在这种情况下,请注意自己删除QProcess实例.

编辑2(错误处理)

QProcess *process = new QProcess;
connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(handleError(QProcess::ProcessError)));
Run Code Online (Sandbox Code Playgroud)

然后定义一个合适的槽(这里是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..
   }
}
Run Code Online (Sandbox Code Playgroud)

有关所有枚举值的详细信息,请参见此处.

如果您的QProcess正确结束但没有预期的输出,您可以查看进程的退出代码并参考gnuplot手册页以获取信息.