Mise en œuvre de la POO:
Développement d’une application
Desktop avec Framework Qt
Introduction sur Qt Framework
Dans la terminologie Qt, un widget est un élément visuel dans une
interface utilisateur. Les boutons, les menus et les barres de
défilement sont des exemples de widgets.
Qt possède une collection de modules:
QtCore: la base de toutes les bibliothèques fournissant les
conteneurs, gestion de threads, gestion des évènements, etc
QtGui et QtWidgets : outils graphiques pour Desktop
QtNetwork: classes nécessaires pour les communications réseau
QtWebkit: moteur webkit permettant l’utilisation de pages web et
web apps dans l’application Qt.
QtSQL:, permettant de interagir facilement avec les SGBD: SQLITE,
MySQL, PostgreSQL
Introduction sur Qt Framework
• Les objets Qt possèdent beaucoup d’attributs accessibles avec les
accesseurs (setters et getters)
• En Qt, si un attribute est appelé “foo”, les setter/getter associés
pourrait avoir les signatures:
• Si foo est un attribut de type booléen, le getter est généralement
préfixé par is, par exemple, bool isFoo().
• Exemple: un objet QPushButton possède des attributs : text, font,
tooltip, icon,
Introduction sur Qt Framework
• Les widgets peuvent contenir d’autres widgets ; par exemple, une
fenêtre d’application est habituellement un widget qui comporte
un QMenuBar, quelques QToolBar, un QStatusBar et d’autres
widgets.
• La plupart des applications utilisent un QMainWindow ou un
QDialog comme fenêtre d’application, mais Qt est si flexible que
n’importe quel widget peut être une fenêtre.
• L’application graphique en Qt doit comporter une fenêtre
principale et optionnellement un ou plusieurs sous-fenêtres.
Composants Qt: Input
Composants Qt: Input
Composants Qt: Output
Composants Qt: Boutton
Autres composants Qt
Hierarchie des classes
Notion de fenêtre
• Un widget qui n'est pas incorporé dans un
widget parent est appelé une fenêtre.
• Les fenêtres ont un cadre et une barre de
titre, mais il est également possible de créer
des fenêtres sans décoration en utilisant
des propriétés spécifiques(window flags).
• La création de fenêtres personnalisées est
réalisée à partir d’une nouvelle classe qui
hérite de QWidget, QDialog ou
QMainWindow.
• Ensuite, on compose sa fenêtre
personnalisée en y intégrant des widgets :
Première application Qt
• Créer une nouveau projet
Fichier > Nouveau Projet > Application> Application Qt avec
Widget
Renseigner le nom du projet
Renseigner le nom de classe représentant la fenêtre principale de
l’application, par exemple MaFenetre puis la classe parent héritée
(Qwidget)
Décocher la case à cocher Générer le code de la fenêtre
Exécuter le programme principal
Première application Qt
Première application Qt
• Code de la fenêtre: mafenetre.h
Première application Qt
• Code de la fenêtre: mafenetre.cpp
Première application Qt
• Ajouter les widgets enfants
Première application Qt
• Instancier les widgets enfants dans le constructeur du parent
Positionnement des widgets(Layout)
• Qt utilise les classes QxxxLayout pour positionner
automatiquement les widgets enfants dans un widget.
• Toutes les sous-classes de QWidget peuvent utiliser les layouts
pour gérer leurs enfants.
Positionnement des widgets(Layout)
• Quelques layouts : horizontal, vertical, grille, formulaire ...
Positionnement des widgets(Layout)
• Utiliser la méthode addWidget() pour ajouter les widgets dans
layout
• void QLayout::addWidget(QWidget *widget)
• Utiliser addLayout() pour ajouter des layouts dans un layout
• void QLayout::addLayout(QLayout *layout)
• Associer un layout à un widget qui devient le propriétaire du
layout et parent des widgets inclus dans le layout (layout principal)
• void QWidget::setLayout (QLayout *layout)
Positionnement des widgets(Layout)
Positionnement des widgets(Layout)
Positionnement des widgets(Layout)
Documentation(Help)
Signals et Slots
Qt Framework fournit 03 mécanismes d’échange de message: Signal, Slot et
connect pour la gestion des événements
Signal: un messages émis par un objet lorsqu’un évènement particulier se
produit.
Slot: une fonction appelée en réponse d’un Signal.
Connect: méthode qui lie un signal à un slot.
Signals et Slots
Exemple: Communication entre Slider et ProgressBar(méthode manuelle)
Signals et Slots
Exemple: Communication entre Slider et ProgressBar (méthode
graphique)
Signals et Slots
Tout objet dont la classe hérite (directement ou non) de la classe
QObject peut émettre et recevoir un signal.
Un signal peut être connecté à un autre signal. Dans ce cas,
lorsque le premier signal est émis, il entraîne l'émission du second.
Émission d'un signal peut être "automatique" par exemple
lorsqu'on appuie sur un bouton, le signal existe déjà dans la classe
utilisée (QPushButton).
On peut forcer l'émission d'un signal à l'aide de la méthode emit :
emit nomSignal(parametreSignal);
Signals et Slots
• La déclaration d'un signal personnalisé est possible:
pas de valeur de retour (donc void) et
pas de définition de la méthode (donc pas corps)
Pour déclarer un signal, on utilise le mot clé signals dans le fichier
d'entête (.h) comme public, private...
signals :
void nomSignal(parametreSignal);
Signals et Slots
Boîte de dialogue: QDialog
Une fenêtre de dialogue est une fenêtre principalement utilisée
pour les tâches à court terme et les communications brèves avec
l'utilisateur. Elle peut être modale ou non.
Une boîte de dialogue modale est une boîte de dialogue qui
bloque l'entrée dans d'autres fenêtres visibles dans la même
application. La manière la plus courante d'afficher une boîte de
dialogue modale consiste à appeler sa fonction exec().
Un dialogue non modale est une boîte de dialogue qui fonctionne
indépendamment des autres fenêtres de la même application. Les
boîtes de dialogue non modélisées sont affichées à l'aide de
show(), qui renvoie immédiatement le contrôle à l'appelant.
Boîte de dialogue: QDialog
Fichier form.h
Boîte de dialogue: QDialog
Fichier form.cpp
Boîte de dialogue: QDialog
Fichier mafenetre.h
Boîte de dialogue: QDialog
Fichier mafenetre.cpp
Boîte de dialogue: QDialog
Boîte de dialogue prédéfinie: QMessageBox
Elle permet d’informer ou demander des infos à l’utilisateur.
Il existe de nombreuses classes permettant de créer des boîtes de
dialogue(QColorDialog, QFontDialog, QPageSetupDialog,
QFileDialog, QPrintDialog, QInputDialog, QProgressDialog,
QErrorMessage) mais on va utiliser QMessageBox.
Ex1: Boîte de dialogue avec un bouton OK
QMessageBox msgBox;
msgBox.setText("The document has
been modified.");
int ret = msgBox.exec();
Boîte de dialogue prédéfinie: QMessageBox
Ex2: Boîte de dialogue avec 3 boutons Save, Discard, Cancel
QMessageBox msgBox;
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);
int ret = msgBox.exec();
Boîte de dialogue prédéfinie: QMessageBox
NB: Il est possible de créer une boîte de dialogue avec les méthodes
statiques de la classe QMessageBox suivantes:
1. void about(QWidget * parent, const QString & title, const QString & text)
2. void aboutQt(QWidget * parent, const QString & title = QString())
3. StandardButton critical(QWidget * parent, const QString & title, const QString
& text, StandardButtons buttons = Ok, StandardButton defaultButton =
NoButton)
4. StandardButton information(QWidget * parent, const QString & title, const
QString & text, StandardButtons buttons = Ok, StandardButton defaultButton =
NoButton)
5. StandardButton question(QWidget * parent, const QString & title, const QString
& text, StandardButtons buttons = StandardButtons( Yes | No ),
StandardButtondefaultButton = NoButton)
6. StandardButton warning(QWidget * parent, const QString & title, const QString
& text, StandardButtons buttons = Ok, StandardButton defaultButton =
NoButton)
Boîte de dialogue prédéfinie: QMessageBox
Créer des fenêtres principales: QMainWindow
Fenêtres principales: menus et barres d’outils
• La majorité des applications GUI modernes proposent des menus,
des menus contextuels et des barres d’outils.
• Les menus permettent aux utilisateurs d’explorer l’application et
d’apprendre à connaître de nouvelles commandes
• Les menus contextuels et les barres d’outils fournissent un accès
rapide aux fonctionnalités fréquemment utilisées.
Fenêtres principales: menus et barres d’outils
• Pour pouvoir utiliser des ressources de Qt(images, videos,…), il
faut créer le fichier ressource de façon suivante:
File > New File or Project > Qt > Qt Resource File > Choose.
Fenêtres principales: menus et barres d’outils
• Pour pouvoir utiliser des ressources de Qt(images, videos,…), il
faut créer le fichier ressource de façon suivante:
Copier les dossiers de fichiers dans le repertoire de votre projet
Sélectionner File > New File or Project > Qt > Qt Resource File >
Choose.
Fenêtres principales: menus et barres d’outils
Fenêtres principales: menus et barres d’outils
3. Sélectionner Ajouter > Ajouter un préfixe
4. Dans le champs Préfixe, remplacer le préfixe par défaut par slash ( / )
Fenêtres principales: menus et barres d’outils
4. Sélectionner Ajouter > Ajouter des fichiers
Fenêtres principales: Gestion de fermeture
La fonction closeEvent() est une fonction virtuelle dans QWidget qui
est appelée automatiquement quand l’utilisateur ferme la fenêtre.
Elle est réimplémentée dans MainWindow, de sorte qu’on puisse
poser à l’utilisateur la question standard "Voulez-vous enregistrer vos
modifications ?"
Fenêtres principales: Gestion de fermeture
Fenêtres principales: Configurer une Action
Créer un slot about() que l’on va connecter à une action
actionApropos.
Fenêtres principales: Configurer une Action
Fenêtres principales: Barre d’états
Une barre d'état peut afficher trois types de messages différents :
temporaire : affiché brièvement. Exemple : utilisé pour afficher les
textes explicatifs de la barre d'outils ou des entrées de menu.
normal : affiché tout le temps, sauf quand un message temporaire
est affiché. Exemple : utilisé pour afficher la page et le numéro de
ligne dans un traitement de texte.
permanent : jamais caché. Exemple : utilisé pour des indications
de mode important comme le verrouillage des majuscules.
La barre d'état peut être récupéré à l'aide de
QMainWindow::statusBar() et remplacé à l'aide de
QMainWindow::setStatusBar().
Fenêtres principales: Zone centrale
La fenêtre principale possède une zone centrale conçu pour
recevoir un et un seul widget.
On y insère un Qwidget ou une de ses classes dérivées et on s'en
sert comme conteneur pour mettre d'autres widgets à l'intérieur.
Fenêtres principales: Zone centrale
Il existe deux types de fenêtre principale:
• SDI (Single Document Interface) : elles ne peuvent afficher qu'un
document à la fois. Exemple: Bloc-Notes.
• MDI (Multiple Document Interface) : elles peuvent afficher
plusieurs documents à la fois. Elles affichent des sous-fenêtres
dans la zone centrale. C'est le cas par exemple de Qt Designer.
Fenêtres principales: Zone centrale SDI
Pour placer un widget dans la zone centrale, on utilise la méthode
setCentralWidget() de la QMainWindow.
Fenêtres principales: Zone centrale MDI
Pour pouvoir afficher plusieurs sous-fenêtres, on utilise un widget
QMdiArea comme zone centrale en se servant de la méthode
setCentralWidget(…) de la QMainWindow.
Les sous-fenêtres sont ajoutées doivent être ajoutées dans le
widget QMdiArea par la méthode addSubWindow(…) de widget
QMdiArea qui renvoie un pointeur QMdiSubWindow
représentant la sous-fenêtre.
Fenêtres principales: Zone centrale MDI
La sous-fenêtre peut être supprimée à l’aide de la méthode
removeSubWindow() de widget QMdiArea
Fenêtres principales: Zone centrale MDI
Pages d’accueil: SplashScreen
De nombreuses applications affichent une page d’accueil au
démarrage.
Certains développeurs se servent de cette page pour dissimuler un
démarrage lent, alors que d’autres l’exploitent pour leurs services
marketing.
La classe QSplashScreen facilite l’ajout d’une page d’accueil aux
applications Qt.
Cette classe affiche une image avant l’apparition de la fenêtre
principale.
Elle peut aussi écrire des messages sur l’image pour informer
l’utilisateur de la progression du processus d’initialisation de
l’application.
En général, le code de la page d’accueil se situe dans main(), avant
l’appel de QApplication::exec().
Pages d’accueil: SplashScreen
Zone de notification( system tray)
Le système d’exploitation moderne fournit généralement une zone
spéciale sur le bureau appelée Zone de notification où les
applications peuvent afficher des icônes ou une message court.
Qt fournit une classe QSystemTrayIcon pour faciliter la création de
cet objet.
Zone de notification( system tray)
Pour afficher un message sur la zone de notification :
Classes utilitaires
Qt fournit des classes de conteneur de modèles:
Les conteneurs séquentiels Qt incluent: QVector, QList,
QLinkedList, QStack, QQueue.
Les conteneurs associatifs Qt incluent: QMap, QMultiMap, QHash,
QMultiHash, QSet.
QStack<T> est une pile fournissant une classe de modèle Qt.
Classes utilitaires
QVector<T> fournit une classe de modèle de tableau dynamique.
Il peut être initialisé de différentes manières:
Classes conteneurs
La classe QList est une classe de modèle qui fournit des listes. Il
stocke les éléments dans une liste qui fournit un accès rapide par
index et des insertions et des suppressions basées sur des index.
Pour insérer des éléments dans la liste, vous pouvez utiliser
operator<<() , insert() , append() ou prepend().
Pour accéder à l'élément à une position d'index particulière, on
peut utiliser l'operator[]() ou at() .
Pour supprimer des éléments, il existe des fonctions telles que
removeAt() , takeAt() , takeFirst() , takeLast() , removeFirst() ,
removeLast() ou removeOne().
Classes d’affichage des données
Qt fournit des classes facilitant l’affichage des données dans votre
application. Ces classes sont:
QTableWidget, QTableView: pour les afficher sous forme de
tableau
QListWidget, QListView: pour les présenter comme liste
d’éléments
QTreeWidget, QTreeView: sous forme des arborescences
Classes d’affichage: QTableWidget
Pour vider un tableau de type QTableWidget:
Pour insérer des enregistrements dans un QTableWidget:
Pour obtenir le numéro d’une ligne sélectionnée:
Classes d’affichage: QTableWidget
Exemple: Gestion des clients
lineEditNumero
lineEditNom
tableCustomer
lineEditAdresse
btnAdd btnCancel
btnEdit btnUpdate btnDelete
Classes d’affichage: QTableWidget
Pour personnaliser le widget QTableWidget, modifier les
propriétés editTriggers, selectionMode, selectionBehavior dans
l’Editeur de propriétés
Classes d’affichage: QTableWidget
Pour ajouter un nouvel enregistrement, cliquer sur le bouton
btnAdd:
Classes d’affichage: QTableWidget
Pour éditer un enregistrement, cliquer sur le bouton btnEdit:
Classes d’affichage: QTableWidget
Pour modifier un enregistrement, cliquer sur le bouton
btnUpdate:
Classes d’affichage: QTableWidget
Pour supprimer un enregistrement, cliquer sur le bouton
btnDelete:
Références
https://doc.qt.io/qt-5/qtexamplesandtutorials.html
https://zetcode.com/gui/qt5/
https://qt.developpez.com/faq/
http://sdz.tdct.org/sdz/le-gui-avec-qt-la-suite.html#Lamanipulationdesfichiers
https://www.siloged.fr/cours/QTCreator/DeployeruneapplicationQT.html