Да/Нет окно сообщения с помощью 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_()