Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何等待QProgressDialog构建?_C++_Qt_Qthread_Qprogressdialog - Fatal编程技术网

C++ 如何等待QProgressDialog构建?

C++ 如何等待QProgressDialog构建?,c++,qt,qthread,qprogressdialog,C++,Qt,Qthread,Qprogressdialog,在执行long操作之前,我将调用QProgressDialog通知用户执行的进度。长操作正在等待线程终止 问题是,当我使用QProgressDialog的show方法时,进度对话框未完全构建,线程进入线程的wait方法,如下图所示: 同时,当我使用QProgressDialog的exec方法时,进度对话框已完全构建,但在退出进度对话框之前不会调用wait方法,如下所示: 这是我正在使用的代码: auto dialog = new QProgressDialog(); dialog->s

在执行long操作之前,我将调用
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()
都会阻塞主线程,因此不能同时运行这两个线程。@Botje
optimizerUi
都是
QThread
。它需要一段时间才能终止,因为它执行复杂的操作@NgocminNgoyen好的,那么我必须使用
对话框的
show()
方法,但是对话框没有内容,有没有办法正确显示对话框,然后终止线程(并调用
wait()
)?感谢您的回复。我想我可以将
QThread::finished()
信号连接到
对话框。隐藏()
插槽,并且根本不调用
等待()
,只需禁用相应的按钮,直到发出线程的
finished
信号。确实如此。让信号为你工作是正确的方式。永远不要阻塞事件循环。