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()
槽中开始下一个过程。为此,您需要一个计数器作为成员变量来跟踪先前启动的进程数,以确定是否必须启动另一个进程。
我有一个 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()
槽中开始下一个过程。为此,您需要一个计数器作为成员变量来跟踪先前启动的进程数,以确定是否必须启动另一个进程。