QProgressDialog:关于MinimumDuration的问题

QProgressDialog: problems about MinimumDuration

本文关键字:问题 MinimumDuration 关于 QProgressDialog      更新时间:2023-10-16

我使用的是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。

总结:

  1. 不设置值是个问题。您有时必须设置值才能使其工作
  2. 一旦插入总工作量将花费超过最小持续时间,就会显示对话框

  3. 默认情况下,将值设置为低于QProgressDialog::minimum()的任何值都会导致进度条保持隐藏状态。

  4. 第二种情况将值设置为0 = minimum。8秒后,您仍未更新该值。这意味着单个项目的处理需要超过8秒。应该显示
  5. 应该修改0 -> minimum -> maximum中的值以获得正确的行为。在第三种情况下,无法执行此操作,因为值从-1到1,而没有设置为0=最小值。未指定,在此版本中不显示
  6. 您的第4种情况意味着"第一次处理花费了0秒,第二次尚未完成"。所以最小持续时间行为开始了。应该显示出来
  7. 现在第一个任务(情况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时,行为是正确的。