在Qt中实时获取cmd命令的输出

问题描述

我在Qt中使用此代码获取cmd命令的输出

{'name': 'John','urls': 'google.com/\r\nbing.com/\r\naskjeeves.com/'`,'user_email': '[email protected]'}

效果很好。
使用此代码,我可以使用 QProcess c_output; c_output.start("some-exe",QStringList() << "param1" << "param2" << "param3..."); if (!c_output.waitForStarted()) std::cout << false; c_output.write("..."); c_output.closeWriteChannel(); if (!c_output.waitForFinished()) std::cout << false; 访问输出,但是问题是这段代码要等到cmd完成exec ...,然后在c_output.readAll()中提供所有输出,我想实时获取输出显示为我程序的gui
我的意思是我赞扬exec之后打印多行,我想在程序中一一显示它们,而不是等它完成。

解决方法

您可以使用waitForReadyRead代替waitForFinished,请参见https://doc.qt.io/qt-5/qprocess.html#waitForReadyRead

以下是用法的简单示例:

#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QProcess>
#include <QDebug>

int main(int argc,char *argv[])
{

    QCoreApplication app(argc,argv);
    QProcess c_output;
    c_output.setProcessChannelMode(QProcess::MergedChannels);
     c_output.start("dmesg",QStringList() << "-w");
     if (!c_output.waitForStarted()){
         qDebug() << "Failed to start";
        return -1;
     }

     c_output.write("...");
     c_output.closeWriteChannel();

     while (c_output.state() != QProcess::NotRunning)
     {
        qDebug() << ".";
        if (c_output.waitForReadyRead())
         qDebug() << "c_output" << c_output.readAllStandardOutput();
     }


    return app.exec();
}