【问题标题】:How to wait for QProgressDialog construction?如何等待 QProgressDialog 构建?
【发布时间】:2021-03-05 15:13:00
【问题描述】:

在执行长操作之前,我调用QProgressDialog 来通知用户执行进度。长操作正在等待线程终止。

问题是,当我使用QProgressDialog的show方法时,进度对话框没有完全构建,线程进入线程的wait方法,如下图所示:

同时,当我使用QProgressDialog 的exec 方法时,进度对话框已完全构建,但在我退出进度对话框之前不会调用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 方法之前,我有什么方法可以等待或强制完全构建进度对话框,这需要相当长的时间并阻塞主线程?感谢您的任何建议。

【问题讨论】:

  • optimizerUi是什么对象?您希望其终止方法发出一个信号,然后将该信号连接到对话框的关闭方法。通过调用wait来阻塞UI是不好的。
  • 我认为您的对话框没有完全构建,但wait() 正在执行,阻止对话框更新视图。 exec() 和 wait() 都阻塞了主线程,所以你不能同时运行它们。
  • @Botje optimizerUi 是 QThread。它需要一段时间才能终止,因为它执行复杂的操作。 @NgocMinhNguyen 好的,那么我必须使用dialog 的show() 方法,但是对话框没有内容,有什么方法可以正确显示对话框然后终止线程(并调用wait())?感谢您的回复。
  • 我想我可以将QThread::finished() 信号连接到dialog.hide() 插槽,并且根本不调用wait(),只需禁用适当的按钮,直到发出线程的finished 信号。
  • 确实如此。让信号为您工作是正确的方法。永远不要阻塞事件循环。

标签: c++ qt qthread qprogressdialog


【解决方案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();

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多