Comment afficher une boîte de message avec des boutons Oui/Non dans Qt et comment vérifier lequel d'entre eux a été appuyé?
C'est à dire. une boîte de message qui ressemble à ceci:
Vous utiliseriez QMessageBox::question
pour cela.
Exemple dans la fente d'un widget hypothétique:
_#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";
}
}
_
Devrait fonctionner sur les Qt 4 et 5, nécessite _QT += widgets
_ sur Qt 5, et _CONFIG += console
_ sur Win32 pour voir la sortie qDebug()
.
Reportez-vous à l’énumération StandardButton
pour obtenir la liste des boutons que vous pouvez utiliser; la fonction renvoie le bouton sur lequel vous avez cliqué. Vous pouvez définir un bouton par défaut avec un argument supplémentaire (Qt " choisit automatiquement un paramètre par défaut approprié " si vous ne spécifiez pas ou _QMessageBox::NoButton
_) .
Vous pouvez utiliser l'objet QMessage pour créer une boîte de message, puis ajouter des boutons:
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
}
QT peut être aussi simple que celui de Windows. Le code équivalent est
if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec())
{
}
Il me manque l’appel de traduction tr
dans les réponses.
Une des solutions les plus simples permettant une internationalisation ultérieure:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
C'est généralement une bonne Qt
habitude de placer des chaînes de niveau code dans un appel tr("Your String")
.
(QMessagebox
comme ci-dessus fonctionne dans n'importe quelle méthode QWidget
)
MODIFIER:
vous pouvez utiliser QMesssageBox
en dehors d'un contexte QWidget
, voir la réponse de @ TobySpeight.
Si vous êtes même en dehors d'un contexte QObject
, remplacez tr
par qApp->translate("context", "String")
- vous aurez besoin de #include <QApplication>
QMessageBox
inclut des méthodes statiques pour poser rapidement de telles questions:
#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
;
}
Si vos besoins sont plus complexes que ceux fournis par les méthodes statiques, vous devez créer un nouvel objet QMessageBox
et appeler sa méthode exec()
pour l'afficher dans sa propre boucle d'événement et obtenir l'identificateur du bouton enfoncé. Par exemple, nous pourrions vouloir que "Non" soit la réponse par défaut:
#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
;
}