Модельное диалоговое окно
Класс QMessageBox предоставляет модельное диалоговое окно для информирования пользователя или для того, чтобы задать пользователю вопрос и получить ответ.
Окно сообщения отображает информативный текст и необязательный подробный текст для предоставление большей информации. В окне может отображаться значок и стандартные кнопки для принятия ответа пользователя.
Данный класс предоставляет два API для использования QMessageBox:
- API на основе свойств (блокировка GUI)
- API на основе статические функции
Вызов API из статических функций является более простым подходом, но он менее гибок, чем использование API на основе свойств, и результат менее информативен.
API на основе свойств
Рассмотрим API на основе свойств, для этого создадим экземпляр QMessageBox, установим свойства и вызовем exec() для вывода сообщения.
Пример:
#include <QMessageBox>
QMessageBox msgBox;
msgBox.setText("Текст");
msgBox.exec();
В результате будет показан модельный диалог с сообщением «Текст». Для закрытия окна нужно нажать кнопку ОК или закрыть окно. Во время показа диалога остальная часть GUI блокируется до тех пор, пока окно сообщения не будет закрыто.
В данном методе можно добавить дополнительные кнопки методом setStandardButtons().
Кнопка по умолчанию (то есть кнопка, активируемая при нажатии клавиши Enter) может быть указана с помощью setDefaultButton(). Если кнопка по умолчанию не указана, QMessageBox пытается найти ее на основе ролей кнопок, используемых в окне сообщения. Экранирующая кнопка (кнопка, активируемая при нажатии клавиши Esc) может быть указана с помощью setEscapeButton(). Если кнопка выхода не указана, QMessageBox пытается найти кнопку, используя эти правила:
- Если есть только одна кнопка, она активируется при нажатии Esc
- Если есть кнопка «Отмена», то эта кнопка активируется при нажатии Esc
- Если есть ровно одна кнопка с ролью «Отклонить» или роль «Нет», то эта кнопка активируется при нажатии клавиши Esc
- Когда кнопка выхода не может быть определена с использованием этих правил, нажатие клавиши Esc не имеет никакого эффекта
Пример:
#include <QMessageBox>
QMessageBox msgBox;
msgBox.setText("Текст");
msgBox.setInformativeText("Сохранить изменения ?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
При нажатия на кнопку метод msgBox.exec() вернет идентификатор выбранной кнопки.
Пример обработки выбранной кнопки:
switch (ret) {
case QMessageBox::Save:
// Нажата кнопка Save
break;
case QMessageBox::Discard:
// Нажата кнопка Discard
break;
case QMessageBox::Cancel:
// Нажата кнопка Cancel
break;
}
Для добавление иконки вызовем метод msgBox.setIcon(), данный метод позволяет добавить свою иконку или использовать из набора QMessageBox.
Пример:
QMessageBox msgBox;
msgBox.setText("Текст");
msgBox.setInformativeText("Сохранить изменения ?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
msgBox.setIcon(QMessageBox::Information);
int ret = msgBox.exec();
Иконки, которые входят в стандартный набор QMessageBox:
| QMessageBox ::Question | Вопрос во время нормальной работы | |
| QMessageBox::Information | Для сообщения информации во время нормальной работы | |
| QMessageBox::Warning | Для сообщения о некритических ошибках | |
| MessageBox::Critical | Для сообщения о критических ошибках |
API на основе статические функции
Данный метод позволяет создать вызвать модельное окно сообщений без использования настроек информативного текста и подробных свойств текста.
Пример использование статического вызова:
int ret = QMessageBox::warning(this, "Имя диалога","Текст",QMessageBox::Save | QMessageBox::Discard| QMessageBox::Cancel, QMessageBox::Save);
Перечень параметров функции:
- Парент
- Имя заголовка окна
- Сообщение в диалоговом окне
- Набор кнопок
- Кнопка по умолчанию
Иконка будет использовании в зависимости от выбранного API функции.
Из доступных возможны следующие варианты:
- QMessageBox::information(…);
- QMessageBox::question(…);
- QMessageBox::warning(…);
- QMessageBox::critical(…) ;
Рассмотрим поближе эти варианты:
QMessageBox::information(this, "Тест","information");

QMessageBox::question(this, "Тест","question");

QMessageBox::warning(this, "Тест","warning");

QMessageBox::critical(this, "Тест","critical");

Полный листинг:
#include <QMessageBox>
// API на основе свойств
QMessageBox msgBox;
msgBox.setText("Текст");
msgBox.setInformativeText("Сохранить изменения ?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
// Нажата кнопка Save
QMessageBox::information(this, "Имя диалога","Save");
break;
case QMessageBox::Discard:
// Нажата кнопка Discard
QMessageBox::information(this, "Имя диалога","Discard");
break;
case QMessageBox::Cancel:
// Нажата кнопка Cancel
QMessageBox::information(this, "Имя диалога","Cancel");
break;
}
// API на основе статические функции
QMessageBox::information(this, "Тест","information");
int t = QMessageBox::question(this, "Тест","question");
switch (t) {
case QMessageBox::Yes:
// Нажата кнопка Yes
QMessageBox::information(this, "Имя диалога","Yes");
break;
case QMessageBox::No:
// Нажата кнопка No
QMessageBox::information(this, "Имя диалога","No");
break;
}
QMessageBox::warning(this, "Тест","warning");
QMessageBox::critical(this, "Тест","critical");
Набор кнопок:
Ok = 0x00000400,
Save = 0x00000800,
SaveAll = 0x00001000,
Open = 0x00002000,
Yes = 0x00004000,
YesToAll = 0x00008000,
No = 0x00010000,
NoToAll = 0x00020000,
Abort = 0x00040000,
Retry = 0x00080000,
Ignore = 0x00100000,
Close = 0x00200000,
Cancel = 0x00400000,
Discard = 0x00800000,
Help = 0x01000000,
Apply = 0x02000000,
Reset = 0x04000000,
