我需要将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。
答案 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;
}