Antworten:
Sie würden dafür verwenden QMessageBox::question
.
Beispiel im Slot eines hypothetischen Widgets:
#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";
}
}
Sollte auf Qt 4 und 5 funktionieren, erfordert QT += widgets
auf Qt 5 und CONFIG += console
auf Win32, um die qDebug()
Ausgabe zu sehen .
In der StandardButton
Aufzählung finden Sie eine Liste der Schaltflächen, die Sie verwenden können. Die Funktion gibt die Schaltfläche zurück, auf die geklickt wurde. Sie können eine Standardschaltfläche mit einem zusätzlichen Argument festlegen (Qt " wählt automatisch einen geeigneten Standard aus ", wenn Sie dies nicht tun oder angeben QMessageBox::NoButton
).
Mit dem QMessage-Objekt können Sie ein Nachrichtenfeld erstellen und dann Schaltflächen hinzufügen:
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
Methodenteil des QMessageBox
Objekts. mit einer, wenn diese Aufzählungen als Parameter: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
Ich vermisse den Übersetzungsaufruf tr
in den Antworten.
Eine der einfachsten Lösungen, die eine spätere Internationalisierung ermöglicht:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
Es ist im Allgemeinen eine gute Qt
Angewohnheit, Strings auf Codeebene in einen tr("Your String")
Aufruf einzufügen.
( QMessagebox
wie oben funktioniert innerhalb jeder QWidget
Methode)
BEARBEITEN:
Sie können QMesssageBox
außerhalb eines QWidget
Kontexts verwenden, siehe die Antwort von @ TobySpeight.
Wenn Sie sich sogar außerhalb eines QObject
Kontexts befinden, ersetzen Sie ihn tr
durch qApp->translate("context", "String")
- Sie müssen#include <QApplication>
QMessageBox
enthält statische Methoden, um solche Fragen schnell zu stellen:
#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
;
}
Wenn Ihre Anforderungen komplexer sind als von den statischen Methoden vorgesehen, sollten Sie ein neues QMessageBox
Objekt erstellen und seine exec()
Methode aufrufen , um es in einer eigenen Ereignisschleife anzuzeigen und die Kennung der gedrückten Schaltfläche zu erhalten. Zum Beispiel möchten wir vielleicht "Nein" als Standardantwort festlegen:
#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
würde ich die Verwendung vorschlagen qApp->translate("context", "String")
, die tr
die Verwendung außerhalb einer QObject
Klasse ersetzt
Wenn Sie es in Python schaffen möchten, müssen Sie diesen Code in Ihrer Workbench überprüfen. schreibe auch so. Wir haben ein Popup-Feld mit Python erstellt.
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_()