我想要立即显示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
立即显示?
答案 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()
。