QProgressDialog 在暂停期间不绘制

Posted

技术标签:

【中文标题】QProgressDialog 在暂停期间不绘制【英文标题】:QProgressDialog not drawing during pause 【发布时间】:2013-03-21 21:15:48 【问题描述】:

我有理由在循环中使用 QProgressDialog,我希望对话框弹出并等待用户输入,然后再显示对话框。但是,在第二次循环中,对话框在开始正确更新之前保持不露面。下面是一些示例代码:

QProgressDialog progressDialog("progress", "Cancel",
               0, 10000);
progressDialog.setMinimumDuration(0);
progressDialog.setWindowModality(Qt::WindowModal);

while(1) 

  progressDialog.show();
  progressDialog.setValue(0);

  qApp->processEvents();

  getchar();

  for(unsigned int i = 0; i < 10000; i++)
    progressDialog.setValue(i+1);

第一次显示对话框中的所有小部件,但第二次显示,什么都没有。如果我在循环内移动 QProgressDialog 声明,也会发生同样的事情。我怎样才能让它在每次通过循环等待用户输入时显示所有小部件,为什么它不在上面的代码中这样做?

【问题讨论】:

【参考方案1】:

这是因为您在 GUI 线程中完成所有工作。由于 getchar() 在用户输入某些内容之前不会返回,因此 GUI 线程无法重新绘制小部件和窗口。

你需要:

将工作代码(从用户读取数据并对其执行操作)移动到其他对象并在单独的线程中运行,很好的例子是在 qt-project 页面上:http://qt-project.org/doc/qt-4.8/qthread.html#details connect worker object with progressDialog using signal and slots

【讨论】:

以上是关于QProgressDialog 在暂停期间不绘制的主要内容,如果未能解决你的问题,请参考以下文章

QProgressDialog::setValue 产生随机堆栈溢出

如何在 C# 中停止/暂停表单绘制?

当主线程显然未阻塞时,QProgressDialog 冻结

Qt QProgressBar 不确定

QProgressDialog:关于最小持续时间的问题

使用 QFuture 更新 QProgressDialog