QProgressDialog:关于最小持续时间的问题
Posted
技术标签:
【中文标题】QProgressDialog:关于最小持续时间的问题【英文标题】:QProgressDialog: problems about MinimumDuration 【发布时间】:2015-11-30 09:28:22 【问题描述】:我使用的是 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 上进行测试。有什么问题?什么是正确的行为?
【问题讨论】:
【参考方案1】:确实信息分散在各处,因此似乎没有任何意义。但是有一个precious hint in the doc:
QProgressDialog ...估计操作将花费的时间 (基于步骤的时间),并且仅在以下情况下才会显示 估计超出 minimumDuration()(默认为 4 秒)。
对话框似乎使用value
属性来估计步骤所需的时间。而且似乎默认没有设置 value 属性
value property:
要使进度对话框按预期工作,您应该最初设置 这个属性为0,最后设置为QProgressDialog::maximum();
确实,dialog->value()
构造后在我的机器中返回 -1。
总结一下:
-
不设置值是个问题。您有时必须设置值才能使其发挥作用。
一旦插入总工作量将超过 minimumDuration
,就会显示对话框将值设置为低于QProgressDialog::minimum()
的值(默认情况下就是这种情况)会导致进度条保持隐藏状态。
0 = minimum
。 8 秒后,您仍然没有更新该值。这意味着处理单个项目需要超过 8 秒。应该显示。
您应该修改 0 -> minimum -> maximum
的值以获得正确的行为。您的第三种情况,因为值从 -1 变为 1,而没有设置为 0 = 最小值,所以无法执行此操作。未指定,在此版本中不显示。
您的第 4 种情况表示“第一次处理耗时 0 秒,第二次尚未完成”。所以 minimumDuration 行为开始了。应该显示出来。
现在第一个任务有 1 秒的持续时间(案例 5),对话框 近似 10 个任务将需要 10 秒,这比 8s
大,因此,一旦执行dlg->setValue(1);
,就会显示对话框。
【讨论】:
听起来很合理。谢谢@UmNyobe。 嗨,UmNyobe,我遇到了另一个问题:使用下面的代码进行测试。对话框立即显示,但我将 MinimumDuration 设置为 5。有问题吗? QProgressDialog* dialog = new QProgressDialog("Message", "Close", 1, 10);对话框->setMinimumDuration(5);对话框->setValue(1); 记住持续时间以毫秒为单位。 对不起,这是一个错字。我的意图是将最小持续时间设置为 5000。立即显示对话框。【参考方案2】:我在 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 时,行为是正确的。
【讨论】:
感谢黑暗骑士。以上是关于QProgressDialog:关于最小持续时间的问题的主要内容,如果未能解决你的问题,请参考以下文章