4

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

1.使用以下代码进行测试。对话框根本不显示。但是文档说:“对话框将在 minimumDuration 时间后或一旦设置任何进度后弹出”。

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

2.使用以下代码进行测试。对话框在 8 秒后显示。但是文档说:“对话框将在 minimumDuration 时间后或设置任何进度后弹出”。尽管文档的行为有所不同,但我认为当前的行为是可以接受的。

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

3.使用以下代码进行测试。该对话框永远不会显示。但是文档说:“对话框将在 minimumDuration 时间后或一旦设置任何进度后弹出”。

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

4

2 回答 2

5

事实上,信息分散在各处,因此似乎没有任何意义。但是文档中有一个宝贵的提示

QProgressDialog ...估计操作将花费的时间(基于步骤的时间),并且仅在该估计超出 minimumDuration() (默认为 4 秒)时才会显示。

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

价值属性

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

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

总结一下:

  1. 不设置值是一个问题。有时您必须设置值才能使其正常工作。
  2. 一旦插入总工作量将超过 minimumDuration ,就会显示该对话框

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

  4. 您的第二种情况将值设置为 0 = minimum. 8 秒后,您仍然没有更新该值。这意味着处理单个项目需要超过 8 秒。应该显示。
  5. 应该修改 from 的值0 -> minimum -> maximum以获得正确的行为。您的第三种情况,因为值从 -1 变为 1,而没有设置为 0 = 最小值,所以无法执行此操作。未指定,在此版本中不显示。
  6. 您的第 4 种情况意味着“第一次处理耗时 0 秒,第二次尚未完成”。所以 minimumDuration 行为开始了。应该显示。
  7. 现在第一个任务有 1 秒的持续时间(案例 5),对话框近似认为 10 个任务将花费 10 秒,这比 大8s,所以一旦dlg->setValue(1);执行,对话框就会显示。
于 2015-11-30T10:06:36.093 回答
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 时,行为是正确的。

于 2015-11-30T10:03:37.160 回答