C++ QProgressDialog:关于最小持续时间的问题

C++ QProgressDialog:关于最小持续时间的问题,c++,windows,qt,qprogressbar,C++,Windows,Qt,Qprogressbar,我正在使用Qt4.8.5。我在QProgressDialog上遇到了一些问题,时间最短。 以下是文档: 1.使用以下代码进行测试。该对话框根本不显示。但是文档中说:“在最短持续时间后或设置任何进度后,对话框将弹出” 2.使用以下代码进行测试。该对话框将在8秒内显示。但是文档上说:“在最短持续时间后,或者设置任何进度后,就会弹出对话框。”。虽然行为与文档不同,但我认为当前的行为是可以接受的 QProgressDialog* dlg = new QProgressDialog("Test", "ca

我正在使用Qt4.8.5。我在QProgressDialog上遇到了一些问题,时间最短。 以下是文档:

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

2.使用以下代码进行测试。该对话框将在8秒内显示。但是文档上说:“在最短持续时间后,或者设置任何进度后,就会弹出对话框。”。虽然行为与文档不同,但我认为当前的行为是可以接受的

QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
3.使用以下代码进行测试。该对话框永远不会显示。但是文档中说:“在最短持续时间后或设置任何进度后,对话框将弹出。”

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);

我在Windoes 7上测试。问题是什么?正确的行为是什么?

我在OS X上用Qt 5测试了这个,得到了相同的结果

仔细查看有关的文档,它指出:-

要使进度对话框按预期工作,首先应将此属性设置为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。。。估计手术所需的时间 (基于步骤的时间),并且仅当 估计值超出最小持续时间()(默认为4秒)

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

:

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

事实上,
dialog->value()
在构建后在我的机器中返回-1

总结:

  • 不设置值是一个问题。有时,您必须设置值才能使其正常工作
  • 当对话框插入总工作量将超过最小持续时间时,将立即显示该对话框

  • 将值设置为低于默认情况下的
    QProgressDialog::minimum()
    ,会使progressbar保持隐藏状态

  • 第二个案例将值设置为
    0=最小值
    。8秒后,您仍然没有更新该值。这意味着处理单个项目需要8秒以上。应该显示
  • 您应该修改
    0->minimum->maximum
    中的值,以获得正确的行为。第三种情况下,无法执行此操作,因为值从-1变为1,而没有设置为0=最小值。未指定,在此版本中不显示
  • 您的第4个案例表示“第一次处理耗时0秒,第二次尚未完成”。因此,最小持续时间行为开始起作用。应该显示
  • 既然第一个任务(案例5)有一秒的持续时间,,对话框近似于10个任务需要10秒,这比
    8s
    大,因此只要
    dlg->setValue(1)就显示对话框被执行

  • 听起来很合理。谢谢@UmNyobe.Hi UmNyobe,我还有一个问题:使用下面的代码进行测试。对话框立即显示,但我将MinimumDuration设置为5。这是个问题吗?QProgressDialog*dialog=新建QProgressDialog(“消息”,“关闭”,1,10);对话框->设置最小持续时间(5);对话框->设置值(1);请记住,持续时间以毫秒为单位。对不起,这是一个输入错误。我的意图是将最短持续时间设置为5000。对话框将立即显示。感谢黑暗骑士。
    QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
    dlg->setMinimumDuration(8000);
    dlg->setValue(0);
    ::Sleep(static_cast<DWORD>(1000));
    dlg->setValue(1);
    
    QProgressDialog* dialog = new QProgressDialog("Message", "Close", 1, 10);
    dialog->setMinimumDuration(5000);
    dialog->setValue(0); 
    dialog->setValue(1); 
    
    QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
    dlg->setMinimumDuration(8000);
    dlg->setValue(0);
    dlg->setValue(1);