web-dev-qa-db-fra.com

Boîte de message Oui / Non à l'aide de QMessageBox

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:

enter image description here

98
sashoalm

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_) .

171
Mat

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
}
37
rednaks

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

}
17
hkyi

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>

4
DomTomCat

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
        ;
}
3
Toby Speight