将 QProcess 输出发送到 textedit 的最佳方法

Posted

技术标签:

【中文标题】将 QProcess 输出发送到 textedit 的最佳方法【英文标题】:best way to send QProcess output to textedit 【发布时间】:2017-12-01 13:07:45 【问题描述】:

目前我通过 QProcess 启动另一个程序并将 read readyReadStandardOutput 连接到一个插槽:

QProcess *start = new QProcess(this);
start->start(program,arguments);
connect(start, SIGNAL(readyReadStandardOutput()), log, SLOT(readyReadStandardOutput()));
connect(start, SIGNAL(readyReadStandardError()), log, SLOT(readyReadStandardError()));

日志的类型是 myTextBrowser

class myTextBrowser : public QTextBrowser
...
public slots:
void readyReadStandardOutput();
void readyReadStandardError();
...

插槽看起来像这样:

void myTextBrowser::readyReadStandardOutput()
    QProcess *p = qobject_cast<QProcess*>(sender());
    QString txt (p->readAllStandardOutput());
    ...
    setText(txt);

问题是,延迟很大。我的 GUI 中的文本每隔几秒钟才会更新一次,有时甚至接近一分钟。

有没有更优雅的解决方案将输出转发到另一个小部件?

请注意,被调用的程序可以运行一个小时,但显示的输出不是很长...但是waitForFinished 是不可能的,因为我希望在进程运行时 GUI 仍然可用。

【问题讨论】:

也许延迟是由您的应用程序本身造成的,当它阻塞事件循环并且GUI无法及时处理事件时? 嗯...我该如何检查这个?如果我对 gui 什么都不做,也会发生这种情况。如果我同时使用 gui 并且发出其他一些信号,它会立即工作。 那么,如果你用setText(txt);将文本设置到文本浏览器后调用update()函数呢? 你如何测量延迟?您确定该进程会在您认为的时候准确地写入标准输出吗?你怎么知道的? 我写了一个关于这个话题的MCVE作为对SO: Creating QT Application as GUI for existing console-based application on windows的回答。您公开的代码看起来与我在那里所做的非常相似。 (有一些我认为不相关的差异。)因此,如果输出片段之间存在意外延迟,则您的子进程不会更频繁地打印文本或 Qt 应用程序的未公开代码中的某些内容。负责。 【参考方案1】:

我的插槽工作正常,如下所示:

void EcuAppControl::readStandardOutput()

  QProcess *p = qobject_cast<QProcess*>(sender());
  p->setReadChannel(QProcess::StandardError);
  while(p->canReadLine())
  
    qDebug() << p->readLine();
  

确保您使用Qt::DirectConnection。但这应该是默认的。

【讨论】:

以上是关于将 QProcess 输出发送到 textedit 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将 QProcess 的输出定向到文件?

将 Ctrl+C 事件发送到在 Windows 上使用 QProcess 启动的进程

如何使用 c && 调用 c++ 函数将应用程序输出重定向到 Qt 中的 textEdit

使用 QProcess 读取标准输出

在另一个窗口中显示 QProcess 输出