在 textBrowser 中实时显示 QProcess 输出

Posted

技术标签:

【中文标题】在 textBrowser 中实时显示 QProcess 输出【英文标题】:Real time display of QProcess output in a textBrowser 【发布时间】:2012-04-11 02:13:32 【问题描述】:

我是 qt 开发的新手,我想将 QProcess 的输出实时传输到 textBrowser。我从执行一个简单的 echo 命令开始,但没有显示程序的输出。 我做错了什么????

QProcess p;
p.start("echo hye");
QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    foreach (QString line, strLines)
    ui->textBrowser->append(line);

附:我在一台 linux 机器上。

编辑: 我仍然无法在 textBrowser 中获得输出。

我更改了Qprocess参数,同时尝试了waitForStarted()和waitForReadyRead(),这样进程就可以及时启动,结果出来了。

我添加了 waitForFinished() 以便进程在超出范围时不会终止。

QProcess p;
    p.start("echo", QStringList() << "hye");
    p.waitForStarted();
    QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    ui->textBrowser->append(line);
    p.waitForFinished();

【问题讨论】:

【参考方案1】:

要读取标准输出,您需要在读取标准输出之前调用 waitForReadyRead(),或者您需要将 Qprocess 的信号 readyReadStandardOutput() 连接到您的插槽并从插槽读取标准输出。

还要确保您的 QProcess 不在堆栈中。

我试过下面的代码工作正常。

编辑:

MyProcess::MyProcess(QObject *parent) :
    QObject(parent)

    QString program = "echo";
    QStringList arguments;
    arguments << "Hello";
    mProcess.start(program,arguments);
    connect(&mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutput()));
    connect(&mProcess,SIGNAL(readyReadStandardError()),this,SLOT(readyReadStandardError()));


void MyProcess::readyReadStandardOutput()
    qDebug()<< mProcess.readAllStandardOutput();


void MyProcess::readyReadStandardError()
    qDebug() << mProcess.readAllStandardError();

【讨论】:

我想在 textBrowser 中显示结果,但是这段代码在 qt 的终端中显示结果。 好吧,你可以使用 ui->textBrowser->append 代替 qDebug() 有关缓冲问题及其解决方法,请参阅 sites.google.com/site/marcsturmspages/qt/…。 感谢您在 waitForReadyRead() 上的提醒!对于我的应用程序来说已经足够了,使用它不需要从 QProcess 子类化。

以上是关于在 textBrowser 中实时显示 QProcess 输出的主要内容,如果未能解决你的问题,请参考以下文章

在Qt编程在lineEdit中输入完内容后点击pushbutton并在TextBrowser显示lineEdit中的内容

在TextBrowser显示中,如何让最新的数据永远出现在第一行或者是在窗口的最后显示信息

Qt 文本浏览器不实时显示

如何更改以前在 textBrowser 中编写的文本的字体大小?

替换 textBrowser PyQt5 上的先前文本

Qt-信号和槽-多对多