Réponses:
Vous utiliseriez QMessageBox::question
pour 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 += widgets
sur Qt 5 et CONFIG += console
sur 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
).
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
}
setIcon
partie méthode QMessageBox
objet. 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
Je manque l'appel de traduction tr
dans 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 Qt
recommandé de placer des chaînes au niveau du code dans un tr("Your String")
appel.
( QMessagebox
comme ci-dessus fonctionne dans n'importe quelle QWidget
méthode)
ÉDITER:
vous pouvez utiliser en QMesssageBox
dehors d'un QWidget
contexte, voir la réponse de @ TobySpeight.
Si vous êtes même en dehors d'un QObject
contexte, remplacez-le tr
par qApp->translate("context", "String")
- vous devrez#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 construire un nouvel QMessageBox
objet 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
;
}
QApplication
je suggère d'utiliser qApp->translate("context", "String")
, qui remplace tr
pour une utilisation en dehors d'une QObject
classe
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_()