Le premier type de boîte de dialogue que nous allons voir est le plus courant : la boîte de dialogue "afficher un message".
Nous allons créer un bouton sur notre fenêtre de type MaFenetre qui appellera un slot personnalisé. Ce slot ouvrira la boîte de dialogue. En clair, un clic sur le bouton doit pouvoir ouvrir la boîte de dialogue.
Les boîtes de dialogue "afficher un message" sont contrôlées par la classe
QMessageBox. Vous pouvez commencer par faire l'include correspondant dans "MaFenetre.h" pour ne pas l'oublier :
#include <QMessageBox>.
Quelques rappels et préparatifs
Pour que l'on soit sûr de travailler ensemble sur le même code, je vous donne le code source des fichiers MaFenetre.h et MaFenetre.cpp sur lesquels je vais travailler. Ils ont été simplifiés au maximum histoire d'éviter le superflu.
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | // MaFenetre.h
#ifndef DEF_MAFENETRE
#define DEF_MAFENETRE
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
public slots:
void ouvrirDialogue();
private:
QPushButton *m_boutonDialogue;
};
#endif
|
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | // MaFenetre.cpp
#include "MaFenetre.h"
MaFenetre::MaFenetre() : QWidget()
{
setFixedSize(230, 120);
m_boutonDialogue = new QPushButton("Ouvrir la boîte de dialogue", this);
m_boutonDialogue->move(40, 50);
QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
}
void MaFenetre::ouvrirDialogue()
{
// Vous insérerez le code d'ouverture des boîtes de dialogue ici
}
|
C'est très simple. Nous avons créé un bouton dans la boîte de dialogue qui appelle le slot personnalisé
ouvrirDialogue(). C'est dans ce slot que nous nous chargerons d'ouvrir une boîte de dialogue.
Au cas où certains se poseraient la question, notre main.cpp n'a pas changé. Allez, je vous le redonne. Je suis trop sympa je sais, ne me remerciez pas
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | // main.cpp
#include <QApplication>
#include "MaFenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MaFenetre fenetre;
fenetre.show();
return app.exec();
}
|
Ouvrir une boîte de dialogue avec une méthode statique
Bien, place à l'action maintenant !
La classe QMessageBox permet de créer des objets de type QMessageBox (comme toute classe qui se respecte

) mais on utilise majoritairement ses méthodes statiques pour des raisons de simplicité. Nous commencerons donc par découvrir les méthodes statiques, qui se comportent je le rappelle comme de simples fonctions. Elles ne nécessiteront pas de créer d'objet.
QMessageBox::information
La méthode statique
information() permet d'ouvrir une boîte de dialogue constituée d'une icône "information".
Son prototype est le suivant :
Code : C++ | StandardButton information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );
|
Seuls les 3 premiers paramètres sont obligatoires, les autres ayant comme vous le voyez une valeur par défaut.
Ces 3 premiers paramètres sont :
- parent : un pointeur vers la fenêtre parente (qui doit être de type QWidget ou hériter de QWidget). Vous pouvez envoyer NULL en paramètre si vous ne voulez pas que votre boîte de dialogue ait une fenêtre parente, mais ce sera plutôt rare.
- title : le titre de la boîte de dialogue (affiché en haut de la fenêtre).
- text : le texte affiché au sein de la boîte de dialogue.
Testons donc un code très simple. Voici le code du slot ouvrirDialogue() :
Code : C++ | void MaFenetre::ouvrirDialogue()
{
QMessageBox::information(this, "Titre de la fenêtre", "Bonjour et bienvenue à tous les Zéros !");
}
|
L'appel de la méthode statique se fait donc comme celui d'une fonction classique, à la différence près qu'il faut mettre en préfixe le nom de la classe dans laquelle elle est définie (d'où le "
QMessageBox::" avant).
Le résultat est une boîte de dialogue comme vous avez l'habitude d'en voir, constituée d'un bouton OK :
Vous noterez que lorsque la boîte de dialogue est ouverte, on ne peut plus accéder à sa fenêtre parente qui est derrière. On dit que la boîte de dialogue est une fenêtre modale : c'est une fenêtre qui "bloque" temporairement son parent en attente d'une réponse de l'utilisateur.
A l'inverse, on dit qu'une fenêtre est non modale quand on peut toujours accéder à la fenêtre derrière. C'est le cas en général des boîtes de dialogue "Rechercher un texte" dans les éditeurs de texte.
Comble du raffinement (j'aime bien cette expression

), il est même possible de mettre en forme son message à l'aide de balises (X)HTML pour ceux qui connaissent. Si vous ne connaissez pas, il est toujours temps d'
apprendre le HTML, j'ai fait un tuto il faut en profiter
Exemple de boîte de dialogue "enrichie" avec du code HTML :
Code : C++ | QMessageBox::information(this, "Titre de la fenêtre", "Bonjour et bienvenue à <strong>tous les Zéros !</strong>");
|
QMessageBox::warning
Si la boîte de dialogue "information" sert à informer l'utilisateur par un message, la boîte de dialogue warning le met en garde contre quelque chose. Elle est généralement accompagné d'un "ding" caractéristique.
Elle s'utilise de la même manière que QMessageBox::information, mais cette fois l'icône change :
Code : C++ | QMessageBox::warning(this, "Titre de la fenêtre", "Attention, vous êtes peut-être un Zéro !");
|
QMessageBox::critical
Quand c'est trop tard et qu'une erreur s'est produite, il ne vous reste plus qu'à utiliser la méthode statique critical() :
Code : C++ | QMessageBox::critical(this, "Titre de la fenêtre", "Vous n'êtes pas un Zéro, sortez d'ici ou j'appelle la police !");
|
QMessageBox::question
Si vous avez une question à poser à l'utilisateur, c'est la boîte de dialogue qu'il vous faut !
Code : C++ | QMessageBox::question(this, "Titre de la fenêtre", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?");
|
C'est bien joli mais... comment peut-on répondre à la question avec un simple bouton OK ?
Par défaut, c'est toujours un bouton OK qui s'affiche. Mais dans certains cas, comme lorsqu'on pose une question, il faudra afficher d'autres boutons pour que la boîte de dialogue ait du sens.
Personnaliser les boutons de la boîte de dialogue
Pour personnaliser les boutons de la boîte de dialogue, il faut utiliser le 4ème paramètre de la méthode statique. Ce paramètre accepte une combinaison de valeurs prédéfinies, séparées par un OR (la barre verticale |). On appelle cela des
flags.
Si vous avez déjà travaillé avec la SDL, vous connaissez cela. Sinon, vous vous y habituerez vite vous verrez, c'est juste une façon pratique d'envoyer des options à une fonction.
Pour ceux qui se poseraient la question, le 5ème et dernier paramètre de la fonction permet d'indiquer quel est le bouton par défaut. On change rarement cette valeur car Qt choisit généralement le bouton qui convient le mieux par défaut.
La
liste des flags disponibles est donnée par la documentation. Vous avez du choix comme vous pouvez le voir.
Si on veut placer les boutons "Oui" et "Non", il nous suffit de combiner les valeurs "QMessageBox::Yes" et "QMessageBox::No"
Code : C++ | QMessageBox::question(this, "Titre de la fenêtre", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?", QMessageBox::Yes | QMessageBox::No);
|
Les boutons apparaissent alors :
Horreur ! Malédiction ! Enfer et damnation !
L'anglais me poursuit, les boutons sont écrits en anglais. Catastrophe qu'est-ce que je vais faire au secouuuuuurs !!!
En effet, les boutons sont écrits en anglais. Mais ce n'est pas grave du tout, les applications Qt peuvent être facilement traduites, je vous en avais parlé en introduction de cette partie.
On ne va pas rentrer dans les détails du fonctionnement de la traduction, on aura l'occasion d'en reparler plus longuement plus tard. Je vais vous donner un code à placer dans le fichier main.cpp, et vous allez l'utiliser gentiment
sans poser de questions.
Attention, j'ai dit : sans poser de question. On n'aime pas trop les gens qui posent des questions ici. Un accident est si vite arrivé...
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | // main.cpp
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include "MaFenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString locale = QLocale::system().name().section('_', 0, 0);
QTranslator translator;
translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&translator);
MaFenetre fenetre;
fenetre.show();
return app.exec();
}
|
Les lignes ajoutées ont été surlignées. Il y a plusieurs includes et quelques lignes de code supplémentaires dans le main.
Normalement, votre application devrait maintenant afficher des boutons en français :
Et voilà le travail !
C'est cool, mais comment je fais pour savoir sur quel bouton l'utilisateur a cliqué ? Hein, hein ?
Quoi ? Encore une question ?
Vous savez, vous réduisez votre espérance de vie avec toutes les questions que vous posez aujourd'hui. Enfin moi j'dis ça comme ça
Bon ok, cette question est pertinente, je peux y répondre. Je dois y répondre même. Alors allons-y !
Récupérer la valeur de retour de la boîte de dialogue
Les méthodes statiques que nous venons de voir retournent un entier (int). On peut tester facilement la signification de ce nombre à l'aide des valeurs prédéfinies par Qt (comme quoi les énumérations c'est pratique !).
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13 | void MaFenetre::ouvrirDialogue()
{
int reponse = QMessageBox::question(this, "Interrogatoire", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?", QMessageBox::Yes | QMessageBox::No);
if (reponse == QMessageBox::Yes)
{
QMessageBox::information(this, "Interrogatoire", "Alors bienvenue chez les Zéros !");
}
else if (reponse == QMessageBox::No)
{
QMessageBox::critical(this, "Interrogatoire", "Tricheur ! Menteur ! Voleur ! Ingrat ! Lâche ! Traître !\nSors d'ici ou j'appelle la police !");
}
}
|
Voici un schéma de ce qui peut se passer :
C'est ma foi clair, non ?