Класс QDialog


Класс QDialog является базовым для всех диалоговых окон, представленных в классовой иерархии Qt. Хотя диалоговое окно можно создавать при помощи любого виджета, сделав его виджетом верхнего уровня, тем не менее, удобнее воспользоваться классом QDialog, который предоставляет ряд возможностей, необходимых всем диалоговым окнам. Диалоговые окна подразделяются на две группы:

  • модальные;
  • немодальные.

Режим модальности и немодальности можно установить и узнать при помощи методов QDialog::setModal() и QDialog::isModal() соответственно.

При установке true соответствует модальному режиму, a false — немодальному.

Модальные диалоговые окна

Такие окна обычно используются для вывода важных сообщений. Например, есть ошибки, на которые пользователь должен отреагировать, прежде чем продолжить работать с приложением. Модальные окна прерывают работу приложения и для продолжения его работы такое окно должно быть закрыто.

В этих случаях модальный диалог — идеальное средство для обращения внимания пользователя на себя.

Для блокировки приложения запускается цикл события только для диалогового окна, а события клавиатуры, мыши и других элементов приложения просто игнорируются. Этот цикл запускается вызовом слота exec(), который возвращает значение целого типа после закрытия диалогового окна. Это значение информирует о нажатой кнопке и может принимать значения QDialog::Accepted или QDialog::Rejected, соответствующие кнопкам Ok и Cancel (Отмена). Типичным примером модального окна является напоминание пользователю, перед закрытием приложения, о необходимости сохранения документа. В момент отображения этого окна возможность работы с самим приложением должна быть заблокирована. Принцип вызова модального диалогового окна примерно следующий:


MyDialog* pdlg = new MyDialog(&data); 
if (pdlg->exec() == QDialog::Accepted) 
{
  // Пользователь выбрал Accepted 
  // Получить данные для дальнейшего анализа и обработки 
  Data data = pdlg->getData();
  ...
}
delete pdlg;

Немодальные диалоговые окна

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

Немодальное окно может быть отображено с помощью метода show(), также как и для обычного виджета. Метод show() не возвращает никаких значений и не останавливает выполнение всей программы. Метод hide() позволяет сделать окно невидимым. Этим свойством можно воспользоваться, и в этом случае не требуется создавать каждый раз объект диалогового окна, а при закрытии удалять его из памяти. Можно ограничиться вызовом методов show() и hide(), что даст возможность отобразить диалоговое окно, на том же месте, на котором оно было свернуто. Немодальные диалоговые окна необходимо снабжать кнопкой Close (Закрыть) для того, чтобы дать возможность пользователю закрыть его.

Читать далее: Создание собственного диалогового окна