Диалоговое окно прогресса QProgressDialog


Для диалогового окна прогресса Qt предоставляет класс QProgressDialog, унаследованный от класса QDialog. Это окно информирует пользователя о начале продолжительной операции и дает возможность визуально оценить время работы. Окно может содержать кнопку Cancel (Отмена) для прерывания начатой операции. При нажатии на нее высылается сигнал canceled(), который следует соединить со слотом, ответственным за прекращение проводимой операции.

Диалоговое окно открывается в том случае, если длительность всей операции будет составлять более трех секунд, гарантируя то, что диалоговое окно прогресса не будет появляться на короткий промежуток времени и вводить пользователя в заблуждение. Время можно изменить, передав в метод setMinimumDuration() целочисленное значение в миллисекундах. Задать количество шагов от начала до конца операции можно с помощью метода setTotalSteps() или при создании, в третьем параметре конструктора. В процессе выполнения операции должен вызываться метод setProgess().

Создание диалогового окна прогресса QProgressDialog

Диалоговое окно прогресса можно создать следующим образом:


int n = 100000; 
QProgressDialog* pprd = new QProgressDialog("Progressing the data...", "&Cancel", 0, n); 
pprd->setMinimumDuration(0); 
pprd->setWindowTitle("Please Wait"); 
for (int i = 0; i < n; ++i) 
{ 
    pprd->setValue(i) ; 
    qApp->processEvents(); 
    if (pprd->wasCanceled()) 
    { 
         break;
    } 
} 
pprd->setValue(n) ; 
delete pprd;

В качестве первого параметра, в конструктор класса QProgressDialog, передается текст поясняющей надписи проводимой операции. Второй параметр представляет собой надпись на кнопке Cancel (Отмена). Третий и четвертый параметры задают количество шагов для проводимой операции. Пятый, опциональный параметр, является указателем на виджет предка. Шестой параметр — опциональный, задает флаги окна. В метод setMinimumDuration() передается значение 0, говорящее о том, что диалоговое окно будет показано без задержек. Вызов метода setWindowTitle() устанавливает текст в заголовке диалогового окна. В цикле for вызывается метод setValue(), обновляющий состояние прогресса. Вызов метода processEvents() из объекта приложения заставляет перед проведением каждой итерации обрабатывать события, что позволяет разблокировать графический интерфейс программы в момент проведения интенсивных операций. В операторе if вызовом метода wasCanceled() проверяется нажатие кнопки Cancel (Отмена), и если она была нажата, то выполнение цикла прерывается.

По окончании операции можно вызвать слот reset(), для того чтобы установить индикатор прогресса в начало. Можно сделать так, чтобы операция установки в начало проводилась автоматически, для чего в метод setAutoReset() передается значение true. Для автоматического закрытия окна по окончании операции вызывается метод setAutoClose(), в который передается true.

Читать далее: Окна сообщений QMessageBox в Qt