QProgressDialog: проблемы с MinimumDuration
Я использую QT 4.8.5. Я столкнулся с некоторыми проблемами в QProgressDialog с MinimumDuration. Вот документация: http://doc.qt.io/qt-4.8/qprogressdialog.html.
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. Какие проблемы? Каковы правильные поведения?
2 ответа
На самом деле информация разбросана вокруг, поэтому, кажется, нет смысла. Но в документе есть драгоценный намек:
QProgressDialog... оценивает время, которое займет операция (на основе времени для шагов), и показывает себя только в том случае, если эта оценка находится за пределами minimalDuration() (по умолчанию 4 секунды).
Диалог, кажется, использует value
свойство, чтобы приблизить время, необходимое для шагов. И кажется, что значение свойства по умолчанию не установлено
Для того, чтобы диалог прогресса работал должным образом, вы должны изначально установить это свойство в 0 и, наконец, установить его в QProgressDialog::maximum();
В самом деле, dialog->value()
возвращает -1 в моей машине после строительства.
Упаковать:
- Не установка значения является проблемой. Вы должны установить значение иногда, чтобы оно работало.
Диалог отображается, как только он интерполирует, что общий объем работы займет больше, чем минимальная продолжительность
Установка значения на что-либо ниже, чем
QProgressDialog::minimum()
, что имеет место по умолчанию, заставляет индикатор выполнения оставаться скрытым.- Ваши вторые случаи устанавливают значение
0 = minimum
, Через 8 секунд вы все еще не обновили это значение. это означает, что обработка одного элемента занимает более 8 секунд. Должен показать. - Вы должны изменить значение из
0 -> minimum -> maximum
за правильное поведение. В третьем случае не удастся сделать это, поскольку значение изменяется от -1 до 1, но не устанавливается на 0 = минимум. Не указано, в этой версии не показывает. - Ваш четвертый случай означает, что "первая обработка заняла 0 секунд, а вторая еще не завершена". Таким образом, поведение минимальной продолжительности наступает. Должно показать.
- Теперь, когда для первой задачи есть одна секунда (пример 5), диалог приблизительно показывает, что 10 задачам потребуется 10 секунд, что больше, чем
8s
, поэтому диалог отображается, как толькоdlg->setValue(1);
выполнен.
Я проверил это на OS X с Qt 5 и получил те же результаты
Присмотревшись ближе к документации для setValue, он заявляет:
Чтобы диалоговое окно прогресса работало должным образом, вы должны сначала установить это свойство в QProgressDialog::imum() и, наконец, установить его в QProgressDialog:: Maximum(); Вы можете вызывать setValue() любое количество промежуточных интервалов.
Имея это в виду, он работает как положено, что видно, когда вы сначала устанавливаете значение на ноль, а затем другое значение.
QProgressDialog* dlg = new QProgressDialog("Test", "cancel", 0, 10);
dlg->setMinimumDuration(8000);
dlg->setValue(0);
dlg->setValue(1);
Итак, я думаю, что документация для setMinimumDuration, вероятно, должна также ссылаться на это, но поведение корректно в соответствии с документацией, принимая во внимание setValue.