QProcess ReadAllStandardError()

时间:2016-11-23 20:06:46

标签: qt qprocess

我需要将QProcess连接到错误处理程序,但我不确定如何将错误字符串传递给插槽。以下内容编译,但不起作用。

QString MainWindow::RunProcess(QString cstring)
{
 QProcess *process = new QProcess(this);
 connect(process,SIGNAL(readyReadStandardError()),this,SLOT( adberror(process::ReadAllStandardError() ) ))
 process->start(cstring);    
}



void MainWindow::adberror(QString errtxt)
{  
  qDebug() << "error handler"; 
  qDebug() << errtxt;
 }

我可以引发进程错误,但adberror()永远不会触发。

运行时,在“应用程序输出”窗格中,我看到:

QObject::connect: No such slot MainWindow::adberror(process::ReadAllStandardError() )
QObject::connect:  (receiver name: 'MainWindow')

编辑:这是Qt 5.6。我做了一个新的qmake / clean。

2 个答案:

答案 0 :(得分:0)

要处理readyReadStandardError()信号,您应将插槽定义为:

private slots:
  void adberror();

并使用它:

connect(process,SIGNAL(readyReadStandardError()),this,SLOT( adberror() ));

即。没有参数。将子进程保留为MainWindow类的字段,以便在数据可用时读取数据。

答案 1 :(得分:0)

你有两个选择

1-在读取输出之前等待

QString MainWindow::RunProcess(QString cstring)
{
  QProcess process;
  process.start(cstring);
  process.waitForFinished();
  QString str = process.readAllStandardOutput();
}

2-让你成为process成员变量并从adberror中移除你的第一个参数。所以,

RunProcess

中的

connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror()))

然后在adberror

QString str = process->readAllStandardOutput();

请注意,在您的代码中,您遇到了问题,因为您的信号和插槽不匹配..此外,ReadAllStandardError无论如何都不会准备就绪!

编辑:第二个解决方案的更多代码

mainwindow.h

class MainWindow
{
   private://methods
      void adberror();

   private://attributes
      QProcess* process;

};

mainwindow.cpp

QString MainWindow::RunProcess(QString cstring)
{
   process = new QProcess(this);
   connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror()));   
   connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); 
   process->start(cstring);    
}

void MainWindow::adberror()
{  
   QString str = process->readAllStandardOutput();
   qDebug() << str;
}