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()
vsopen()
). - Он отлично работает с кастомными темами интерфейса.