Модельное диалоговое окно
Класс 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,