Да / Нет окно сообщения с использованием QMessageBox

Как показать окно сообщения с кнопками Да / Нет в Qt и как проверить, какая из них была нажата?

То есть окно сообщения, которое выглядит так:

введите описание изображения здесь

91

Решение

Вы бы использовали QMessageBox::question для этого.

Пример в слоте гипотетического виджета:

#include <QApplication>
#include <QMessageBox>
#include <QDebug>

// ...

void MyWidget::someSlot() {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "Test", "Quit?",
QMessageBox::Yes|QMessageBox::No);
if (reply == QMessageBox::Yes) {
qDebug() << "Yes was clicked";
QApplication::quit();
} else {
qDebug() << "Yes was *not* clicked";
}
}

Должен работать на Qt 4 и 5, требует QT += widgets на Qt 5 и CONFIG += console на Win32 увидеть qDebug() выход.

Увидеть StandardButton enum, чтобы получить список кнопок, которые вы можете использовать; функция возвращает кнопку, которая была нажата. Вы можете установить кнопку по умолчанию с дополнительным аргументом (Qt «автоматически выбирает подходящее значение по умолчанию«Если вы этого не сделаете или не укажете QMessageBox::NoButton).

157

Другие решения

Вы можете использовать объект QMessage для создания окна сообщения и затем добавить кнопки:

QMessageBox msgBox;
msgBox.setWindowTitle("title");
msgBox.setText("Question");
msgBox.setStandardButtons(QMessageBox::Yes);
msgBox.addButton(QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
if(msgBox.exec() == QMessageBox::Yes){
// do something
}else {
// do something else
}
34

QT может быть таким же простым, как и в Windows. Эквивалентный код

if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec())
{

}
15

Я скучаю по переводу tr в ответах.

Одно из самых простых решений, которое позволяет для дальнейшей интернационализации:

if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}

Это вообще хорошо Qt привычка помещать строки уровня кода в tr("Your String") вызов.

(QMessagebox как указано выше работает в любом QWidget метод)

РЕДАКТИРОВАТЬ:

ты можешь использовать QMesssageBox вне QWidget контекст, см. ответ @ TobySpeight.

Если вы даже вне QObject контекст, заменить tr с qApp->translate("context", "String") — вам нужно #include <QApplication>

4

QMessageBox включает в себя статические методы, чтобы быстро задать такие вопросы:

#include <QApplication>
#include <QMessageBox>

int main(int argc, char **argv)
{
QApplication app{argc, argv};
while (QMessageBox::question(nullptr,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No)
!= QMessageBox::Yes)
// ask again
;
}

Если ваши потребности сложнее, чем предусмотрено статическими методами, вы должны создать новый QMessageBox объект, и назовите его exec() метод, чтобы показать его в своем собственном цикле событий и получить идентификатор нажатой кнопки. Например, мы могли бы сделать «Нет» ответом по умолчанию:

#include <QApplication>
#include <QMessageBox>

int main(int argc, char **argv)
{
QApplication app{argc, argv};
auto question = new QMessageBox(QMessageBox::Question,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No,
nullptr);
question->setDefaultButton(QMessageBox::No);

while (question->exec() != QMessageBox::Yes)
// ask again
;
}
3

Если вы хотите сделать это в Python, вам нужно проверить этот код в вашем рабочем месте.
тоже напиши вот так.
мы создали всплывающее окно с Python.

msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
ret = msgBox.exec_()
-1
По вопросам рекламы [email protected]