如何检查QProcess是否正确执行?

4
QProcess process_sdcompare;
QString command_sdcompare;
QStringList args_sdcompare;

command_sdcompare = "diff";
args_sdcompare << "Filename" << "Filename";

process_sdcompare.start(command_sdcompare,args_sdcompare,QIODevice::ReadOnly);
process_sdcompare.waitForFinished();                                        
QString StdOut_sdcompare = process_sdcompare.readAllStandardOutput(); //Reads standard output
QString StdError_sdcompare = process_sdcompare.readAllStandardError(); //Reads standard error

if(StdOut_sdcompare.isEmpty())  //the process output is checked here if empty it is a success
    return 1;

我正在运行上述代码。当我比较不相似的文本文件后检查错误条件时,isEmpty() 返回 false

如何检查 QProcess 的执行是否发生错误?


2
只是一条评论,与您的问题无关:您在代码中的注释非常无用。它们只是被调用函数的名称,单词之间有空格。最好注释为什么以这种方式编写,而不是发生了什么,在行中应该清楚地看到。 - Karsten Koop
关于你的问题:你应该查看进程的退出代码 - Karsten Koop
4个回答

9

我使用 QProcess::error() 来查询最后一个错误(便于快速调试),然而有一种更好的方式:

// capture any errors (do this before you run the process)
connect(&process_sdcompare, &QProcess::errorOccurred, this, &ThisClass::processError);

然后定义插槽:
ThisClass::processError(QProcess::ProcessError error)
{
    qDebug() << "error enum val = " << error << endl;
}

更新

或者使用Lambda表达式:

// No need to define a slot function...
connect(&process_sdcompare, &QProcess::errorOccurred, [=](QProcess::ProcessError error) 
{ 
    qDebug() << "error enum val = " << error << endl; 
});

2
如果使用lambda函数(Qt 5)连接而不是定义槽,我认为代码会更整洁,但除此之外,这确实是正确的方法;O) - TheDarkKnight
@TheDarkKnight 嗯...好吧,逼我写一个lambda : ) ,我的lambda定义还有点生疏,请检查一下它是否正确(今天我身边没有开发电脑)。 - code_fodder

3

我认为所有的状态和错误函数都没什么用,无法确定进程执行是否成功。比如,在Windows下尝试执行一个不存在的程序:

error(): QProcess::ProcessError(FailedToStart)
exitStatus(): QProcess::ExitStatus(NormalExit)
exitCode(): 0
errorString(): "Process failed to start: Das System kann die angegebene Datei nicht finden."

如果进程确实成功执行:

error(): QProcess::ProcessError(UnknownError)
exitStatus(): QProcess::ExitStatus(NormalExit)
exitCode(): 0
errorString(): "Unknown error"

因此,我认为“未知错误”不是成功的指标。

我认为解决方案可能如下:

QProcess *m_proc = new QProcess(this);
bool errorOccured = false;
QProcess::ProcessError procError;
QObject::connect(m_proc, &QProcess::errorOccurred, [&](QProcess::ProcessError error)
{
    procError = error;
    errorOccured = true;
});

m_proc->start(...);

0

waitForFinished 返回时,它会返回一个广义表示成功的 bool。正如 Karsten 建议的,您可以使用 QProcess::exitCode 来检查实际的成功或失败。


0

这是使用 QProcess 的方法

QProcess process_sdcompare;
QStringList args_sdcompare;
args_sdcompare << "Filename" << "Filename";    
process_sdcompare.setProgram("diff");
process_sdcompare.setArguments(args_sdcompare);
process_sdcompare.start();
if (process_sdcompare.waitForStarted() && process_sdcompare.waitForFinished()) {
  QString StdOut_sdcompare = process_sdcompare.readAllStandardOutput();   
  QString StdError_sdcompare = process_sdcompare.readAllStandardError();

  if(StdOut_sdcompare.isEmpty())
      return 1;
  }
}

这是一个很好的代码示例,但我不认为它真正回答了用户的问题(如何检查QProcess执行中的错误)。 - code_fodder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接