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