Qt QProgressDialog不会立即显示

Qt QProgressDialog不会立即显示,qt,modal-dialog,progressdialog,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);

我有一个
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(int i=1;i设定值(2*i-1);
如果(进度->已取消())
打破
完成一半任务();
进度->设定值(2*i);
如果(进度->已取消())
打破
做后半部分();
}
进度->设置值(2*selection.size()+1);
但是有了这段代码,对话框窗口的边框就出现了,里面没有任何小部件,只有在完整的for循环完成后,对话框窗口才会充满标签和进度条

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

最小持续时间:int

如果设置为0,则在设置任何进度后,始终显示该对话框。默认值为4000毫秒

在设置
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);
}
ProcessBar p=newprocessbar();
本.Controls.Add(p);
...
对于(int i=0;i<100;i++){
p、 值=i;
睡眠(1);
}
然后,您会遇到这样的问题:表单无法到达重新绘制表单的代码


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

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

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


您可以在循环内调用
QCoreApplication::processEvents()
,允许它返回事件处理一段时间。

要立即显示对话框,只需调用
QProgressDialog::show()
setValue()
就已经调用了
processEvents()
我正在另一个线程中按照@MaddinTribleD建议使用
QtConcurrent
实现循环,但这有点棘手,因为我的数据位于非并发树上。如果在不同的线程中循环解决了这个问题,我会接受这个答案。