QProcess ReadAllStandardError()

QProcess ReadAllStandardError()

我需要将 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.

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

private slots:
  void adberror();

并使用它:

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

即没有争论。将子进程保留为 MainWindow class 的一个字段,以便在数据可用时读取数据。

你有两个选择

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;
}