Ответы:
Вы бы использовали 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
Перечисление, чтобы получить список кнопок, которые вы можете использовать; функция возвращает нажатую кнопку. Вы можете установить кнопку по умолчанию с дополнительным аргументом (Qt « выбирает подходящее значение по умолчанию автоматически », если вы этого не сделаете или не укажете 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
}
setIcon
методическая часть QMessageBox
объекта. с одним, если эти перечисления в качестве параметров: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
В 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>
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
;
}
QApplication
я предлагаю использовать qApp->translate("context", "String")
, который заменяет tr
использование вне QObject
класса
Если вы хотите сделать это на 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_()