2015-06-05 3 views
1

У меня есть окно, в котором я хочу последовательно выполнять несколько процессов и после завершения каждого процесса хочу записать его вывод в виджет TextEdit. Мой код выглядит следующим образом:Qt - вывод всех процессов, записанных сразу в 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

Ваш цикл блокирует цикл событий Qt, поэтому графический интерфейс пользователя не обновляется. Вы можете использовать QCoreApplication::processEvents() один раз в итерации цикла для обновления графического интерфейса:

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

В качестве альтернативы вы можете начать следующий процесс в вашем processFinished() слоте. Для этого вам понадобится счетчик в качестве переменной-члена, который отслеживает количество ранее запущенных процессов, чтобы узнать, должен ли запускаться другой процесс.

+0

Спасибо, что сработало. Вы спасатель жизни! : D – Casteurr