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