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
实现循环,但这有点棘手,因为我的数据位于非并发树上。如果在不同的线程中循环解决了这个问题,我会接受这个答案。