C++ 如何等待QProgressDialog构建?
在执行long操作之前,我将调用C++ 如何等待QProgressDialog构建?,c++,qt,qthread,qprogressdialog,C++,Qt,Qthread,Qprogressdialog,在执行long操作之前,我将调用QProgressDialog通知用户执行的进度。长操作正在等待线程终止 问题是,当我使用QProgressDialog的show方法时,进度对话框未完全构建,线程进入线程的wait方法,如下图所示: 同时,当我使用QProgressDialog的exec方法时,进度对话框已完全构建,但在退出进度对话框之前不会调用wait方法,如下所示: 这是我正在使用的代码: auto dialog = new QProgressDialog(); dialog->s
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
方法之前,是否有任何方法可以等待或强制完全构建进度对话框,这需要相当长的时间并阻塞主线程?谢谢您的建议。您可以等待线程超时完成。如果线程已完成,请关闭“进度”对话框。如果不是,则处理应用程序事件
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();
这是什么样的对象?您希望它的terminate方法发出一个信号,然后将该信号连接到对话框的close方法。通过调用wait来阻止UI是不好的。我认为您的对话框没有完全构建,但是
wait()
正在执行,阻止对话框更新视图。exec()
和wait()
都会阻塞主线程,因此不能同时运行这两个线程。@BotjeoptimizerUi
都是QThread
。它需要一段时间才能终止,因为它执行复杂的操作@NgocminNgoyen好的,那么我必须使用对话框的show()
方法,但是对话框没有内容,有没有办法正确显示对话框,然后终止线程(并调用wait()
)?感谢您的回复。我想我可以将QThread::finished()
信号连接到对话框。隐藏()
插槽,并且根本不调用等待()
,只需禁用相应的按钮,直到发出线程的finished
信号。确实如此。让信号为你工作是正确的方式。永远不要阻塞事件循环。