Qt:QProcess调用终端+脚本

Posted

技术标签:

【中文标题】Qt:QProcess调用终端+脚本【英文标题】:Qt: QProcess to call terminal + script 【发布时间】:2013-12-30 14:03:42 【问题描述】:

我在使用 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);

谁能告诉我怎么了?还是在一个进程中执行多个命令的正确方法?

【问题讨论】:

【参考方案1】:

这个 sn-p 可能有用(未经测试)。有关每种方法的详细信息,请参阅QProcess 文档。

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

编辑

您的程序中似乎有问题的另一件事是您作为父级提供给 QProcess 实例的未定义​​指针。设置父级以利用自动删除子级很有用。在这种情况下,请注意自己删除 QProcess 实例。

EDIT 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 手册页以获取信息。

【讨论】:

程序意外结束。不知道为什么,对我来说似乎是合乎逻辑的。在使用 QProcess 之前,它工作正常。 您可以将您的 QProcess 实例连接到 error signal 以获取有关进程意外结束的更多信息 父声明似乎是问题所在,现在仍在测试,但看起来不错 可悲的是,仍然无法正常工作,它似乎没有执行 gnuplot 命令,我的输出没有改变。如何在 QT 中显示错误消息 @user2961097:您在几乎相同的其他问题中检查了我的代码吗?那会打印出错误。此外,当 errorString() 可用时,此错误与其自己的自定义错误消息有些错误。详情见我的回答。

以上是关于Qt:QProcess调用终端+脚本的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:多个 QProcess 和输出

Qt QProcess startDetached 无法结束进程(bash 会话)

在 Qt 控制台应用程序中读写 QProcess

在 Qt QProcess 中运行 sudo 命令

QProcess 执行 python3 脚本无法正常工作

如何杀死由 Qt QProcess 运行的 MATLAB 批处理?