2

我想将标准输出从 QProcess 获取到 QTextEdit 中。如果我这样做,它会起作用:

QObject::connect(process, SIGNAL(readyReadStandardOutput()),
                 this, SLOT(readStdOutput()));

void myClass::readStdOutput()
{
  teOutput->insertPlainText(process->readAllStandardOutput());
}

虽然子程序不断打印到标准输出(在终端中测试),但 QTextEdit 仅每隔几秒钟更新一次,并带有输出块。

4

2 回答 2

2

QIODevice手册:

QIODevice 的某些子类,例如 QTcpSocket 和 QProcess,是异步的。这意味着诸如 write() 或 read() 之类的 I/O 函数总是立即返回,而当控制返回事件循环时,可能会发生与设备本身的通信。QIODevice 提供的功能允许您强制立即执行这些操作,同时阻塞调用线程并且不进入事件循环。

要尝试的另一件事是禁用任何缓冲区,手册没有提到 QProcess,但您可以尝试一下:

一些子类,例如 QFile 和 QTcpSocket,是使用内存缓冲区实现的,用于中间存储数据。这减少了所需的设备访问调用的数量,这些调用通常非常慢。

...

QIODevice 允许您通过将 Unbuffered 标志传递给 open() 来绕过任何缓冲。

于 2012-04-19T08:00:23.443 回答
0

调用 waitForReadyRead() 似乎会触发更新。

因此,要更新例如每秒 10 次,之后

QObject::connect(process, SIGNAL(readyReadStandardOutput()),
             this, SLOT(readStdOutput()));

添加一个

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(executeWaitForReadyRead()));
timer->start(100);

void YourClass::executeWaitForReadyRead()
{
    process->waitForReadyRead();
}
于 2013-12-08T15:51:25.723 回答