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

时间:2015-06-05 16:34:05

标签: qt qprocess

我有一个窗口,我希望按顺序执行多个进程,每个进程完成后我想在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);
}`

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你的循环阻止了Qt的事件循环,这就是GUI没有更新的原因。 您可以在每次循环迭代时使用QCoreApplication::processEvents()一次来更新GUI:

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

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