QMessageBox

Автор: | 12 августа, 2019

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

Класс 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,