2015-11-14 3 views
1

Я разрабатываю настольное приложение Qt. Мне нужно показать неопределенный индикатор выполнения пользователя во время моей программы. Я не могу определить время вычислений и не могу определить количество шагов, поэтому в моей реализации единственным признаком является использование неопределенного индикатора выполнения. Я попытался использовать QProgressDialog. Единственный вариант, который работал (я имею в виду показал прогресс пользователя бар) было что-то вроде этого:Qt5 progress bar

QProgressDialog dialog("Computing", "Cancel", 0, 0); 
dialog.setWindowModality(Qt::WindowModal); 
dialog.exec(); 

//further code 

Но, как вы можете понять, что в дальнейшем код не работал в то время как диалог выполнял.

Я также попытался использовать метод show(), но Qt не отобразил диалоговое окно, я имею в виду, что в окне калькуляции было прозрачно.

Итак, не могли бы вы предложить некоторые решения, которые помогут мне показать индикатор работы пользователя и вычислить одновременно? Время вычисления может сильно отличаться.

+0

Если вы делаете длинное вычисление после show() в том же потоке, вы блокируете цикл событий, и индикатор выполнения никогда не будет окрашен. Вызов processEvents() был бы уродливым обходным решением (пользовательский интерфейс будет все еще очень вялым), рабочий поток - это чистое решение. –

ответ

1

Чтобы показать прогресс некоторой работы параллельно с отзывчивым UI мы обычно должны иметь:

  1. UI поток не блокируется этой параллельной работы
  2. Рабочий поток (QThread) выполнять работу
  3. UI должен иметь кнопку Отмена, чтобы остановить работу
  4. прогресс UI бар показывает фиксированные шаги [0 ... X] или перекручивание

Если цель состоит в том, чтобы показать «плавающую» прогресс: How to show an 'infinite floating' progressbar in Qt without knowing the percentage?

Если цель состоит в том, чтобы создать индикатор, показывающий некоторые «реалистичную» степень проделанной работы:

Вы должны оценить полное время как-то тогда. Сделайте расчет эксперимента и измерьте его полный рабочий день. Предположим, что это будет среднее время. Затем сделайте ход, управляемый таймером, чтобы он продвигался на 1/2 длины хода, а если не был сделан, он предполагает, что оставшееся время в два раза больше. И затем проверьте на оставшиеся 1/4 снова и снова ожидайте в два раза дольше. Сделайте это до тех пор, пока не будет достигнута небольшая часть прогресса, скажем, около 1%, но видимая для пользователя и оставит ее до полного расчета. Как вы можете догадаться, когда работа выполнена, вы продвигаете прогресс до конца, показывая, что пользователь готов к работе.

Чтобы полностью ответить на этот вопрос, вам, вероятно, придется разбить его на несколько менее тяжелых вопросов. Сначала попробуйте выполнить шаг за шагом по таймеру. Затем попробуйте создать задание вычисления математики в отдельном потоке и сделать его сигналом для пользовательского интерфейса. Когда у вас есть больше особенностей для некоторых частей реализации, программисты C++/Qt, вероятно, смогут ответить.

Вот несколько примеров: tutorial #1, tutorial #2 по прогрессу Qt с таймером.