我使用的是QT 4.8.5。我在使用MinimumDuration的QProgressDialog上遇到了一些问题。以下是文档:http://doc.qt.io/qt-4.8/qprogressdialog.html#minimumDuration-道具。
1.使用以下代码进行测试。该对话框根本不显示。但文档中写道:"对话框将在最短持续时间后弹出,或者在设置任何进度后立即弹出"。
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
2.使用以下代码进行测试。该对话框将在8秒内显示。但文档中写道:"一旦设置了任何进度,对话框将在最短持续时间或后弹出"。尽管行为与文档不同,但我认为当前的行为是可以接受的。
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
3.使用以下代码进行测试。该对话框从不显示。但文档中写道:"对话框将在最短持续时间后或设置任何进度后弹出"。
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(1);
4.使用以下代码进行测试。行为与项目2相同。
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
dlg->setValue(1);
5.使用以下代码进行测试。一旦将进度值设置为1,就会显示对话框。为什么Sleep()函数会影响这里的行为?
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
::Sleep(static_cast<DWORD>(1000));
dlg->setValue(1);
6.使用以下代码进行测试。对话框会立即显示,但我将MinimumDuration设置为5。这是个问题吗?
QProgressDialog* dialog = new QProgressDialog("Message", "Close", 1, 10);
dialog->setMinimumDuration(5000);
dialog->setValue(0);
dialog->setValue(1);
我在Windoes 7上测试。有什么问题?正确的行为是什么?
事实上,信息分散在各处,因此似乎毫无意义。但文档中有一个宝贵的提示:
QProgress对话框。。。估计手术所需的时间(基于步骤的时间),并且仅当估计值超过minimumDuration()(默认为4秒)。
该对话框似乎使用value
属性来近似步骤所需的时间。而且似乎值属性默认情况下没有设置
value属性:
为了使进度对话框按预期工作,您应该首先设置此属性设置为0,并最终将其设置为QProgressDialog::maximum();
事实上,dialog->value()
在构建之后在我的机器中返回-1。
总结:
- 不设置值是个问题。您有时必须设置值才能使其工作
-
一旦插入总工作量将花费超过最小持续时间,就会显示对话框
-
默认情况下,将值设置为低于
QProgressDialog::minimum()
的任何值都会导致进度条保持隐藏状态。 - 第二种情况将值设置为
0 = minimum
。8秒后,您仍未更新该值。这意味着单个项目的处理需要超过8秒。应该显示 - 您应该修改
0 -> minimum -> maximum
中的值以获得正确的行为。在第三种情况下,无法执行此操作,因为值从-1到1,而没有设置为0=最小值。未指定,在此版本中不显示 - 您的第4种情况意味着"第一次处理花费了0秒,第二次尚未完成"。所以最小持续时间行为开始了。应该显示出来
-
现在第一个任务(情况5)有一秒的持续时间,对话框近似为10个任务需要10s,这比
8s
大,因此一旦执行dlg->setValue(1);
,就会显示对话框
我在OS X上用Qt 5进行了测试,得到了相同的结果
仔细查看setValue的文档,它指出:-
为了使进度对话框按预期工作,您应该首先将此属性设置为QProgressDialog::minimum(),最后将其设置为QPProgressDialog::maximum();您可以调用setValue()任意次数。
考虑到这一点,它可以按预期工作,正如您首先将值设置为零,然后再设置另一个值时所看到的那样。
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
dlg->setValue(1);
因此,我认为setMinimumDuration的文档可能也应该链接到这一点,但根据文档,当考虑到setValue时,行为是正确的。