Да/Нет окно сообщения с помощью QMessageBox
Как показать окно сообщения с кнопками да/нет в Qt, и как проверить, какая из них была нажата?
т. е. окно сообщения выглядит так:
6 ответов:
можно использовать
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
перечисление, чтобы получить список кнопок, которые вы можете использовать; функция возвращает кнопку, которая была нажата. Вы можете установить кнопку по умолчанию с дополнительным аргументом (Кварты "выбирает подходящий по умолчанию автоматически " если вы этого не сделаете или не укажетеQMessageBox::NoButton
).
вы можете использовать объект 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 }
QT может быть так же просто, как и Windows. Эквивалентный код -
if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec()) { }
я пропустил перевод вызова
tr
в ответах.одно из самых простых решений, которое позволяет впоследствии интернационализировать:
if (QMessageBox::Yes == QMessageBox::question(this, tr("title"), tr("Message/Question"))) { // do stuff }
это вообще хорошо
Qt
привычка помещать строки уровня кода вtr("Your String")
звонок.(
QMessagebox
как выше работает в любойQWidget
способ)EDIT:
можно использовать
QMesssageBox
за пределамиQWidget
контекст, см. ответ @TobySpeight.если вы даже за пределами
QObject
контексте, заменитьtr
СqApp->translate("context", "String")
- вам понадобится#include <QApplication>
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 ; }
Если вы хотите сделать это в 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_()