Qt - 在 TextEdit 中一次写入所有进程的输出

Qt - output of processes all written at once in TextEdit

我有一个 window,我想在其中按顺序执行多个进程,在每个进程完成后,我想将其输出写入 TextEdit 小部件。我的代码如下:

`

for (int i = 0; i < numberOfTests; i++){
    ui->textEdit->append(QString("Running test: ") + QString::number(i + 1));
    this->runningToolProcess = new QProcess();
    connect(this->runningToolProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(rightMessage()));
    connect(this->runningToolProcess, SIGNAL(readyReadStandardError()), this, SLOT(wrongMessage()));
    connect(this->runningToolProcess, SIGNAL(finished(int)), this, SLOT(processFinished()));
    this->runningToolProcess->start(
        QString::fromStdString("/path/to/executable"),
        testParameters
    );
    this->runningToolProcess->waitForFinished();
}`

rightMessage和wrongMessage函数如下:

`
void RunningToolWindow::rightMessage()
{
    QByteArray strdata = this->runningToolProcess->readAllStandardOutput();
    ui->textEdit->setTextColor(Qt::black);
    ui->textEdit->append(strdata);
}
void RunningToolWindow::wrongMessage()
{
    QByteArray strdata = this->runningToolProcess->readAllStandardError();
    ui->textEdit->setTextColor(Qt::red);
    ui->textEdit->append(strdata);
}`

我遇到的问题是,所有的输出都是在所有测试执行完毕后立即写入的,而不是随着测试的进行而不断显示它们的输出。我尝试在每次测试后插入延迟 运行 但这似乎没有解决问题。

我该如何解决这个问题?

您的循环阻塞了 Qt 的事件循环,这就是 GUI 不更新的原因。 您可以在每个循环迭代中使用一次 QCoreApplication::processEvents() 来更新 GUI:

for (int i = 0; i < numberOfTests; i++){
    ...
    this->runningToolProcess->waitForFinished();
    QCoreApplication::processEvents();
}

或者,您可以在 processFinished() 槽中开始下一个过程。为此,您需要一个计数器作为成员变量来跟踪先前启动的进程数,以确定是否必须启动另一个进程。