Boîte de message Oui / Non utilisant QMessageBox

108

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é?

Ie une boîte de message qui ressemble à ceci:

entrez la description de l'image ici

sashoalm
la source

Réponses:

184

Vous utiliseriez QMessageBox::questionpour cela.

Exemple dans l'emplacement 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 Qt 4 et 5, nécessite QT += widgetssur Qt 5 et CONFIG += consolesur Win32 pour voir la qDebug()sortie.

Consultez l' StandardButtonénumération pour obtenir une liste des boutons que vous pouvez utiliser; la fonction renvoie le bouton sur lequel l'utilisateur a cliqué. Vous pouvez définir un bouton par défaut avec un argument supplémentaire (Qt " choisit automatiquement une valeur par défaut appropriée " si vous ne le faites pas ou spécifiez QMessageBox::NoButton).

Tapis
la source
J'ai une question concernant la façon dont vous générez dynamiquement la boîte de message: vaut-il mieux le faire comme ceci ou prédéfinir le tout (créer et stocker la boîte de message dans une variable etc.) et l'appeler simplement si nécessaire?
rbaleksandar
1
@rbaleksandar Il est préférable d'utiliser les méthodes statiques QMessageBox. Qt nettoiera toute mémoire utilisée lors du retour des méthodes, il n'est pas nécessaire d'en garder une en mémoire de manière permanente.
JoshL
Merci, c'est logique. Après tout, cette partie de l'interface utilisateur n'est pas quelque chose qui 1) nécessite beaucoup de ressources prend donc un certain temps à charger et 2) est souvent ou même constamment à l'écran pour que l'utilisateur le voie.
rbaleksandar
Meilleure réponse jamais.
GeneCode
41

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
}
rednaks
la source
Réponse intéressante, comment y ajouteriez-vous une icône? Vous aimez l'information?
Dariusz
1
@Dariusz: vous avez la setIconpartie méthode QMessageBoxobjet. avec un si ces énumérations en tant que paramètres: QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
rednaks
19

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()) 
{

}
hkyi
la source
5

Je manque l'appel de traduction trdans les réponses.

Une des solutions les plus simples, qui permet une internationalisation ultérieure:

if (QMessageBox::Yes == QMessageBox::question(this,
                                              tr("title"),
                                              tr("Message/Question")))
{
    // do stuff
}

Il est généralement Qtrecommandé de placer des chaînes au niveau du code dans un tr("Your String")appel.

( QMessageboxcomme ci-dessus fonctionne dans n'importe quelle QWidgetméthode)

ÉDITER:

vous pouvez utiliser en QMesssageBoxdehors d'un QWidgetcontexte, voir la réponse de @ TobySpeight.

Si vous êtes même en dehors d'un QObjectcontexte, remplacez-le trpar qApp->translate("context", "String")- vous devrez#include <QApplication>

DomTomCat
la source
4

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 construire un nouvel QMessageBoxobjet et appeler sa exec()méthode pour l'afficher dans sa propre boucle d'événements et obtenir l'identifiant du bouton enfoncé. Par exemple, nous pourrions vouloir faire "Non" comme 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
        ;
}
Toby Speight
la source
2
Puisque vous avez déjà inclus, QApplicationje suggère d'utiliser qApp->translate("context", "String"), qui remplace trpour une utilisation en dehors d'une QObjectclasse
DomTomCat
-2

Si vous voulez le faire en python, vous devez vérifier ce code dans votre atelier. écrivez aussi comme ça. nous avons créé une boîte contextuelle avec 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_()
Rajendra Prasad Taidala
la source