我想将stdout从QProcess转换为QTextEdit。 如果我这样做就行了:
QObject::connect(process, SIGNAL(readyReadStandardOutput()),
this, SLOT(readStdOutput()));
和
void myClass::readStdOutput()
{
teOutput->insertPlainText(process->readAllStandardOutput());
}
当子程序连续打印到stdout(在终端中测试) QTextEdit只用输出块每几秒更新一次。
答案 0 :(得分:2)
来自QIODevice
手册:
QIODevice的某些子类,例如QTcpSocket和QProcess,是异步的。这意味着诸如write()或read()之类的I / O函数总是立即返回,而当控制返回到事件循环时,可能会发生与设备本身的通信。 QIODevice提供的功能允许您立即执行这些操作,同时阻止调用线程而不进入事件循环。
要尝试的另一件事是禁用任何缓冲区,手册没有提及QProcess,但你可以试试:
一些子类,如QFile和QTcpSocket,是使用内存缓冲区实现的,用于中间存储数据。这减少了所需的设备访问呼叫的数量,这通常非常慢。
...
QIODevice允许您通过将Unbuffered标志传递给open()来绕过任何缓冲。
答案 1 :(得分: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();
}