Risposte:
Lo useresti QMessageBox::question
per quello.
Esempio nello slot di un ipotetico widget:
#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";
}
}
Dovrebbe funzionare su Qt 4 e 5, richiede QT += widgets
su Qt 5 e CONFIG += console
su Win32 per vedere l' qDebug()
output.
Vedere l' StandardButton
enumerazione per ottenere un elenco di pulsanti che è possibile utilizzare; la funzione restituisce il pulsante che è stato cliccato. Puoi impostare un pulsante predefinito con un argomento extra (Qt " sceglie automaticamente un valore predefinito adatto " se non lo fai o lo specifichi QMessageBox::NoButton
).
È possibile utilizzare l'oggetto QMessage per creare una finestra di messaggio, quindi aggiungere i pulsanti:
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
parte metodo QMessageBox
dell'oggetto. con uno se queste enumerazioni come parametri: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
Mi manca la chiamata di traduzione tr
nelle risposte.
Una delle soluzioni più semplici, che consente una successiva internazionalizzazione:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
È generalmente una buona Qt
abitudine inserire stringhe a livello di codice all'interno di una tr("Your String")
chiamata.
( QMessagebox
come sopra funziona con qualsiasi QWidget
metodo)
MODIFICARE:
puoi usare QMesssageBox
al di fuori di un QWidget
contesto, vedi la risposta di @ TobySpeight.
Se sei anche al di fuori di un QObject
contesto, sostituisci tr
con qApp->translate("context", "String")
- dovrai#include <QApplication>
QMessageBox
include metodi statici per porre rapidamente tali domande:
#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
;
}
Se le tue esigenze sono più complesse di quanto previsto dai metodi statici, dovresti costruire un nuovo QMessageBox
oggetto e chiamare il suo exec()
metodo per mostrarlo nel suo ciclo di eventi e ottenere l'identificatore del pulsante premuto. Ad esempio, potremmo voler impostare "No" come risposta predefinita:
#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
ti suggerisco di utilizzare qApp->translate("context", "String")
, che sostituisce tr
l'uso al di fuori di una QObject
classe
Se vuoi farlo in Python devi controllare questo codice nel tuo workbench. scrivi anche così. abbiamo creato una finestra popup con 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_()