运行文件时如何使用qprocess实时读取输出

Posted

技术标签:

【中文标题】运行文件时如何使用qprocess实时读取输出【英文标题】:How to use qprocess to read output in real time while running the file 【发布时间】:2019-08-15 04:03:12 【问题描述】:

我是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 确实显示“可以调用该进程”。

void Dialog::logRead()

     QProcess *process = dynamic_cast<QProcess *>( sender() );

if (process)
  ui->textBrowser->append( p->readAllStandardOutput() );  

我不知道为什么我不能实时输出文本,即使我没有得到任何输出!!有什么建议吗?谢谢!

【问题讨论】:

离题但...来自QProcess::setProcessChannelMode:"This mode will be used the next time start() is called"。所以在start 之后调用setProcessChannelMode 可能不会有预期的效果。 【参考方案1】:

您的问题必须在您应用的不同部分。我的最小可重现示例按预期工作。

#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();

【讨论】:

谢谢。我再试一次后它可以工作,但它不是实时消息,它会有大约半分钟的延迟。 @LankoKuo:也许你的程序没有刷新它的输出。例如,std::cout &lt;&lt; "Hello\n"; std::cout &lt;&lt; "Hello" &lt;&lt; std::endl; 之间存在差异。这是您可以回查的内容。

以上是关于运行文件时如何使用qprocess实时读取输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 QProcess 读取标准输出

使用QProcess和VS C ++进行实时通信时出现问题

使用 QProcess 时无法读取命令的输出

如何在 PySide 中获取 QProcess 运行的命令的输出?

需要 virtenv 时如何运行 QProcess?

如何在 PyQt5 中对 QProcesses 进行排队?