运行文件时如何使用qprocess实时读取输出
How to use qprocess to read output in real time while running the file
我是qt初学者。如果这个问题解决了,那将是非常有帮助的。
我想使用 QProcess 来执行文件并将实时输出显示到 QTextviewer。
该文件无法停止 运行,除非您在终端命令行中按 ctrl c。否则,该文件在 linux 中的终端上运行良好。
出现的主要问题是:该进程确实由 qt 启动,但是,我没有看到任何输出。
我尝试信号(readyReadStandardOutput)和插槽。当我添加 waitforfinished() 时,GUI 将冻结。
if(!process)
{
process = new QProcess (this);
}
process -> setWorkingDirectory("mydir");
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(logRead()));
connect(process, SIGNAL(readyReadStandardError()), this, SLOT(readError()));
process -> start("./file");
process -> setProcessChannelMode(QProcess::MergedChannels);
if(false == peocess-> waitForStarted())
{
ui -> textBrowser->append("the process cannot be called");
}else{
ui -> textBrowser->append("the process can be called");
}
textBrowser 确实显示 "the process can be called"。
void Dialog::logRead()
{
QProcess *process = dynamic_cast<QProcess *>( sender() );
if (process){
ui->textBrowser->append( p->readAllStandardOutput() );
}
我不知道为什么我不能实时输出文本,即使我没有得到任何输出!!有什么建议吗?谢谢!
您的问题一定出在您应用的其他部分。我的最小可重现示例按预期工作。
#include <QApplication>
#include <QDebug>
#include <QTextBrowser>
#include <QProcess>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
auto process = new QProcess;
auto view = new QTextBrowser;
process->setWorkingDirectory("C:/Temp");
QObject::connect(process, &QProcess::readyReadStandardOutput, [process,view]() {
auto output=process->readAllStandardOutput();
view->append(output);
});
QObject::connect(process, &QProcess::readyReadStandardError, [process,view]() {
auto output=process->readAllStandardError();
view->append(output);
});
process->start("MyProgram.exe");
process->setProcessChannelMode(QProcess::MergedChannels);
process->waitForStarted();
qDebug() << process->error();
view->show();
return a.exec();
}
我是qt初学者。如果这个问题解决了,那将是非常有帮助的。 我想使用 QProcess 来执行文件并将实时输出显示到 QTextviewer。 该文件无法停止 运行,除非您在终端命令行中按 ctrl c。否则,该文件在 linux 中的终端上运行良好。 出现的主要问题是:该进程确实由 qt 启动,但是,我没有看到任何输出。
我尝试信号(readyReadStandardOutput)和插槽。当我添加 waitforfinished() 时,GUI 将冻结。
if(!process)
{
process = new QProcess (this);
}
process -> setWorkingDirectory("mydir");
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(logRead()));
connect(process, SIGNAL(readyReadStandardError()), this, SLOT(readError()));
process -> start("./file");
process -> setProcessChannelMode(QProcess::MergedChannels);
if(false == peocess-> waitForStarted())
{
ui -> textBrowser->append("the process cannot be called");
}else{
ui -> textBrowser->append("the process can be called");
}
textBrowser 确实显示 "the process can be called"。
void Dialog::logRead()
{
QProcess *process = dynamic_cast<QProcess *>( sender() );
if (process){
ui->textBrowser->append( p->readAllStandardOutput() );
}
我不知道为什么我不能实时输出文本,即使我没有得到任何输出!!有什么建议吗?谢谢!
您的问题一定出在您应用的其他部分。我的最小可重现示例按预期工作。
#include <QApplication>
#include <QDebug>
#include <QTextBrowser>
#include <QProcess>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
auto process = new QProcess;
auto view = new QTextBrowser;
process->setWorkingDirectory("C:/Temp");
QObject::connect(process, &QProcess::readyReadStandardOutput, [process,view]() {
auto output=process->readAllStandardOutput();
view->append(output);
});
QObject::connect(process, &QProcess::readyReadStandardError, [process,view]() {
auto output=process->readAllStandardError();
view->append(output);
});
process->start("MyProgram.exe");
process->setProcessChannelMode(QProcess::MergedChannels);
process->waitForStarted();
qDebug() << process->error();
view->show();
return a.exec();
}