QProgressDialog不会立即显示

时间:2016-10-16 12:51:13

标签: 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

     

如果设置为0,则只要设置了任何进度,就会始终显示该对话框。默认值为4000毫秒。

在设置progress->setValue(1)之后,我希望在第一个循环传递中立即显示对话框。

如何让QProgressDialog立即显示?

3 个答案:

答案 0 :(得分:1)

不确定这是否与Qt匹配 但是在C#中,如果你在同一个线程中运行你的代码,比如

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

然后你遇到的问题是你的表格没有到达重绘的代码。

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

答案 1 :(得分:1)

当你让主线程进入循环时,它不能进行任何事件处理,直到循环结束并且你的方法返回。

因此,一旦完成,它只能处理所有“绘画更新”请求。

您可以在循环中调用QCoreApplication::processEvents()以允许它暂时返回事件处理。

答案 2 :(得分:0)

要立即显示对话框,只需调用QProgressDialog::show()

相关问题