QProgressDialog:有关MinimumDuration的问题

时间:2015-11-30 09:28:22

标签: c++ windows qt qprogressbar

我使用的是QT 4.8.5。我在使用MinimumDuration的QProgressDialog上遇到了一些问题。 以下是文档:http://doc.qt.io/qt-4.8/qprogressdialog.html#minimumDuration-prop

1.使用以下代码进行测试。根本不显示该对话框。但文档说:" 对话框将在最小持续时间 之后或在设置任何进度后立即弹出#34;。

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.有什么问题?什么是正确的行为?

2 个答案:

答案 0 :(得分:3)

我在OS X上使用Qt 5进行了测试,得到了相同的结果

仔细观察setValue的文档,它指出: -

  

为了使进度对话框按预期工作,您应该首先将此属性设置为QProgressDialog :: minimum(),最后将其设置为QProgressDialog :: maximum();你可以在中间任意多次调用setValue()。

考虑到这一点,它可以正常工作,如第一次将值设置为零,然后是另一个值时可以看到。

QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
dlg->setValue(1);

所以,我认为setMinimumDuration的文档也可能链接到这个,但根据文档,当考虑setValue时,行为是正确的。

答案 1 :(得分:3)

事实上,信息分散在各处,所以似乎毫无意义。但是有一个precious hint in the doc

  

QProgressDialog ...估算操作所需的时间   ( 基于步骤的时间 ),并且只显示自己   估计超出minimumDuration()(默认为4秒)。

对话框似乎使用value属性来估算步骤所需的时间。而且似乎默认情况下没有设置值属性

value property

  

要使进度对话框按预期工作,您应该首先进行设置   此属性为0,最后将其设置为QProgressDialog :: maximum();

确实,dialog->value()在我的机器中在构造后返回-1。

总结:

  1. 不设定值是个问题。 有时必须设置值才能使其正常工作。
  2. 对话框会在插入总金额工作量超过minimumDuration时显示

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

  4. 您的第二个案例将值设置为0 = minimum。 8秒后,您仍然没有更新该值。这意味着单个项目的处理时间超过8秒。应该显示。
  5. 应该修改0 -> minimum -> maximum中的值以获得正确的行为。第三种情况,由于值从-1变为1而未设置为0 =最小值,因此无法执行此操作。未指定,在此版本中不显示。
  6. 你的第四个案件意味着&#34;第一个处理需要0秒,第二个处理尚未完成&#34;。所以minimumDuration行为开始了。应该显示。
  7. 现在第一个任务有一个第二个持续时间(案例5),对话框近似 10个任务将占用10个,大于{ {1}},因此只要8s执行,就会显示对话框。