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调用终端+脚本的主要内容,如果未能解决你的问题,请参考以下文章