【发布时间】: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