Відповіді:
Ви б використали 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_()