我有一个窗口,我希望按顺序执行多个进程,每个进程完成后我想在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);
}`
我遇到的问题是所有输出都在所有测试完成后立即写入,而不是随着测试的进行而连续显示输出。我尝试在每次测试运行后插入延迟,但似乎没有解决问题。
我该如何解决这个问题?
答案 0 :(得分:1)
你的循环阻止了Qt的事件循环,这就是GUI没有更新的原因。
您可以在每次循环迭代时使用QCoreApplication::processEvents()
一次来更新GUI:
for (int i = 0; i < numberOfTests; i++){
...
this->runningToolProcess->waitForFinished();
QCoreApplication::processEvents();
}
或者,您可以在processFinished()
广告位中开始下一个流程。为此,您需要一个计数器作为成员变量,该变量跟踪先前启动的进程的数量,以确定是否必须启动另一个进程。