Ответы:
Вы бы использовали 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_()