QMessageBox в Qt C++ — расширенное руководство

Автор: | 7 июня, 2025

QMessageBox — это удобный виджет из Qt для отображения диалогов с сообщениями. Он широко используется для вывода ошибок, предупреждений, вопросов и информации. Но помимо базовых возможностей, у QMessageBox есть расширенные функции, которые позволяют гибко его настраивать.

Базовое использование QMessageBox

QMessageBox::information(this, "Информация", "Операция выполнена успешно.");
QMessageBox::warning(this, "Предупреждение", "Недостаточно прав доступа.");
QMessageBox::critical(this, "Ошибка", "Не удалось сохранить файл.");
QMessageBox::question(this, "Вопрос", "Вы действительно хотите выйти?");

Возвращаемое значение — обработка ответа QMessageBox

auto reply = QMessageBox::question(this, "Подтвердите", "Удалить элемент?", 
                                   QMessageBox::Yes | QMessageBox::No);

if (reply == QMessageBox::Yes) {
    // Удаляем
} else {
    // Отмена
}

Пользовательские кнопки в QMessageBox

QMessageBox msgBox;
msgBox.setWindowTitle("Выбор действия");
msgBox.setText("Что вы хотите сделать?");

QPushButton *openButton = msgBox.addButton("Открыть", QMessageBox::AcceptRole);
QPushButton *saveButton = msgBox.addButton("Сохранить", QMessageBox::DestructiveRole);
msgBox.addButton(QMessageBox::Cancel);

msgBox.exec();

if (msgBox.clickedButton() == openButton) {
    // логика открытия
} else if (msgBox.clickedButton() == saveButton) {
    // логика сохранения
}

Использование иконок и подробного текста в QMessageBox

QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText("Ошибка при сохранении файла.");
msgBox.setInformativeText("Проверьте доступ к папке или имя файла.");
msgBox.setDetailedText("Ошибка: permission denied.\nФайл: /home/user/data.txt");
msgBox.setStandardButtons(QMessageBox::Retry | QMessageBox::Abort);
msgBox.setDefaultButton(QMessageBox::Retry);
msgBox.exec();

Асинхронное использование со слотами

QMessageBox *box = new QMessageBox(QMessageBox::Question,
                                   "Подтверждение",
                                   "Вы уверены?",
                                   QMessageBox::Yes | QMessageBox::No,
                                   this);
connect(box, &QMessageBox::buttonClicked, this, [=](QAbstractButton *button){
    if (box->buttonRole(button) == QMessageBox::YesRole) {
        qDebug() << "Пользователь выбрал ДА";
    }
});
box->open(); // не блокирует основной поток

Стилизация через Qt Style Sheets (CSS)

QMessageBox msgBox;
msgBox.setText("Стилизованное сообщение");
msgBox.setStyleSheet("QMessageBox { background-color: #2b2b2b; color: white; font: 12pt 'Arial'; }");
msgBox.exec();

Использование в потоках

Важно: QMessageBox должен вызываться из GUI-потока. Если вам нужно отобразить сообщение из другого потока — используйте сигналы:

// В рабочем потоке
emit showError("Ошибка соединения с сервером");

// В основном потоке (слот)
void MainWindow::showError(const QString &text) {
    QMessageBox::critical(this, "Ошибка", text);
}

QMessageBox — мощный инструмент, подходящий не только для простых сообщений, но и для полноценной интерактивной логики, пользовательских диалогов и адаптивного взаимодействия с пользователем.

Дополнительно:

  • Можно переопределить стили оконной иконки.
  • Можно использовать его в качестве модального или немодального окна (exec() vs open()).
  • Он отлично работает с кастомными темами интерфейса.