Odpowiedzi:
Używałbyś QMessageBox::question
do tego.
Przykład w slocie hipotetycznego widżetu:
#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";
}
}
Powinien działać na Qt 4 i 5, wymaga QT += widgets
Qt 5 i CONFIG += console
Win32, aby zobaczyć qDebug()
wyjście.
Zobacz StandardButton
wyliczenie, aby uzyskać listę przycisków, których możesz użyć; funkcja zwraca przycisk, który został kliknięty. Możesz ustawić przycisk domyślny z dodatkowym argumentem (Qt "automatycznie wybiera odpowiednią wartość domyślną ", jeśli tego nie zrobisz lub nie określisz QMessageBox::NoButton
).
Możesz użyć obiektu QMessage, aby utworzyć skrzynkę wiadomości, a następnie dodać przyciski:
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
część metody QMessageBox
obiektu. z jednym, jeśli te QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
wyliczenia
W odpowiedziach brakuje mi wezwania do tłumaczenia tr
.
Jedno z najprostszych rozwiązań, które pozwala na późniejszą internacjonalizację:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
Ogólnie dobrym Qt
zwyczajem jest umieszczanie w tr("Your String")
wywołaniu ciągów znaków na poziomie kodu .
( QMessagebox
jak wyżej działa w ramach dowolnej QWidget
metody)
EDYTOWAĆ:
możesz używać QMesssageBox
poza QWidget
kontekstem, zobacz odpowiedź @ TobySpeight.
Jeśli jesteś nawet poza QObject
kontekście wymienić tr
z qApp->translate("context", "String")
- trzeba#include <QApplication>
QMessageBox
zawiera statyczne metody szybkiego zadawania takich pytań:
#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
;
}
Jeśli Twoje potrzeby są bardziej złożone niż przewidują to metody statyczne, powinieneś skonstruować nowy QMessageBox
obiekt i wywołać jego exec()
metodę, aby pokazać go we własnej pętli zdarzeń i uzyskać identyfikator wciśniętego przycisku. Na przykład możemy chcieć, aby domyślną odpowiedzią było „Nie”:
#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
Jeśli chcesz zrobić to w Pythonie, musisz sprawdzić ten kod w swoim środowisku roboczym. też pisz w ten sposób. stworzyliśmy wyskakujące okienko w Pythonie.
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_()