首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QProcess ReadAllStandardError()

QProcess ReadAllStandardError()
EN

Stack Overflow用户
提问于 2016-11-23 20:06:45
回答 2查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
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()永远不会触发。

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

代码语言:javascript
复制
QObject::connect: No such slot MainWindow::adberror(process::ReadAllStandardError() )
QObject::connect:  (receiver name: 'MainWindow')

编辑:这是QT5.6。我做了一次新的清洁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-23 20:54:34

你有两个选择

1-在读取输出之前等待

代码语言:javascript
复制
QString MainWindow::RunProcess(QString cstring)
{
  QProcess process;
  process.start(cstring);
  process.waitForFinished();
  QString str = process.readAllStandardOutput();
}

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

RunProcess

代码语言:javascript
复制
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror()))

然后在adberror

代码语言:javascript
复制
QString str = process->readAllStandardOutput();

请注意,在您的代码中,您有一个问题,因为您的信号和插槽args不匹配。而且,ReadAllStandardError也不会做好任何准备!

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

mainwindow.h

代码语言:javascript
复制
class MainWindow
{
   private://methods
      void adberror();

   private://attributes
      QProcess* process;

};

mainwindow.cpp

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2016-11-23 20:52:08

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

代码语言:javascript
复制
private slots:
  void adberror();

并使用它:

代码语言:javascript
复制
connect(process,SIGNAL(readyReadStandardError()),this,SLOT( adberror() ));

也就是没有争论。将子进程保留为MainWindow类的字段,以便在数据可用时读取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40773286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档