qt - QProgressDialog 不立即显示

标签 qt modal-dialog progressdialog

我有一个要立即显示的QProgressDialog

QProgressDialog *progress = new QProgressDialog("Downloading files...", 
  "Cancel", 0, 2*selection.size()+1);
progress->setMinimumDuration(0);
progress->setWindowModality(Qt::WindowModal);
progress->setValue(0);

然后我对任务运行一个 for 循环并最终分配最大值:

for (int i = 1; i < selection.size()+1; ++i) 
{
  progress->setValue(2*i-1);
  if (progress->wasCanceled())
    break;
  do_half_task();
  progress->setValue(2*i);
  if (progress->wasCanceled())
    break;
  do_second_half();
}
progress->setValue(2*selection.size()+1);

但是使用这段代码,对话框窗口边框出现,内部没有任何小部件是透明的,并且只有在完整的 for 循环完成时才会填充标签和进度条。

我认为这是因为只有在完整循环完成后,Qt 才能计算每个步骤的持续时间,并检查它是否为 >0,我将其设置为最短持续时间。但是,从文档中我看到

minimumDuration : int

If set to 0, the dialog is always shown as soon as any progress is set. The default is 4000 milliseconds.

在设置 progress->setValue(1) 后,我希望对话框会在第一次循环中立即出现。

如何让我的QProgressDialog立即出现?

最佳答案

不确定这是否也适用于 Qt 但是在 C# 中,如果您在同一个线程中运行代码的执行,例如

ProcessBar p = new ProcessBar();
this.Controls.Add(p);
...
for (int i = 0; i < 100; i++) {
  p.Value = i;
  Thread.Sleep(1);
}

那么您的问题是您的表单没有到达重绘代码处。

也许尝试在另一个线程中执行循环?

关于qt - QProgressDialog 不立即显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070444/

相关文章:

c++ - 输入 SpinBox 时点击默认的 QPushButton

ios4 - 以模态方式呈现 UITabBarController - 自动旋转问题

java - ProgressDialog 没有立即显示

安卓 : How to get rid of weird border around progress dialog

android - 在嵌套选项卡 Activity 中显示 ProgressDialog 时出现问题

c++ - 在 Qt 中创建套接字

python - 将相对图像路径绑定(bind)到 *.py 文件

javascript - 无法在 Handlebars 内填充字段 if 语句

html - W3 Modal 立即打开和关闭

c++ - 如何通过ODBC从系统间缓存数据库获取数据?