Как дождаться построения QProgressDialog?

Перед выполнением длительной операции я вызываю QProgressDialogдля информирования пользователя о ходе выполнения. Долгие операции ждут завершения потока.

Проблема в том, что когда я использую show метод QProgressDialog, диалоговое окно прогресса не полностью построено, и поток переходит в wait способ резьбы, как вы можете видеть на рисунке ниже:

Между тем, когда я использую exec метод QProgressDialog, диалог выполнения полностью построен, но wait не вызывается, пока я не выйду из диалогового окна прогресса, как вы можете видеть здесь:

Это код, который я использую:

       auto dialog = new QProgressDialog();
dialog->setWindowTitle("Wait");
dialog->setLabelText("Aborting optimization");

dialog->resize(100, 30);
dialog->show();

optimizerUi->terminate();
optimizerUi->wait();

dialog->hide();

Есть ли способ подождать или заставить диалоговое окно прогресса быть полностью построенным до того, как поток попадет в waitметод, который занимает довольно много времени и блокирует основной поток? Спасибо за любое предложение.

1 ответ

Решение

Вы можете дождаться завершения потока с некоторым таймаутом. Если поток завершен, закройте диалоговое окно выполнения. Если это не так, обработайте события приложения.

auto dialog = new QProgressDialog();
dialog->setWindowTitle("Wait");
dialog->setRange(0, 0);
dialog->setLabelText("Aborting optimization");
dialog->setCancelButton(nullptr);

dialog->resize(100, 30);
dialog->show();

optimizerUi->terminate();
while (!optimizerUi->wait(QDeadlineTimer{100}))
{
    QApplication::processEvents();
}
dialog->hide();
Другие вопросы по тегам