Présentation du framework Qt
Qu’est-ce que Qt ?
-
C’est un framework de développement multiplateforme écrit en C++
-
Les applications écrites sont indépendantes du système d’exploitation (Linux, Windows, MacOS, FreeBSD …)
-
À l’origine : destiné à coder des interfaces graphiques (GUI)
Maintenant : ensemble de librairies généralistes
-
base de données, réseau, graphismes (OpenGL), multimédia …
-
-
Créé par Trolltech en 1996, racheté par Nokia en 2008, cédé à Digia en 2012, supporté par The Qt Company (filliale de Digia) depuis 2014
-
Gratuit pour usage non commercial
-
Framework à la base de l’environnement de bureau KDE sous Linux
GNOME est basé sur le framework GTK+ (→ Logiciel de retouche d’images The Gimp).
-
disponible pour plateformes embarquées (→ Qt for Embedded Linux)
-
Qt étend le C++ avec des macros mais reste du C++ standard
-
Qt est organisé en modules
Qui utilise Qt ?
Qt est utilisé dans plusieurs domaines :
-
les systèmes d’exploitation → environnement de bureau KDE
-
des logiciels en tous genre :
-
Calibre → gestionnaire de livres numériques
-
KiCAD → logiciel de conception électronique
-
WireShark → analyseur de paquets réseau
-
Cisco Packet Tracer → simulation de réseau
-
…
-
-
les systèmes embarqués :
-
l’industrie :
L’environnement de développement
Qt dispose d’un environnement de développement qui lui est dédié.
Il est constitué d’un ensemble d’outils accessibles depuis l’IDE Qt Creator
-
qmake: commande qui prend en charge la construction d’une application Qt à partir de makefiles -
Qt Designer : Conception visuelle d’interface graphique, édition de ressources
-
Qt Assistant : documentation des classes C++ du framework, tutoriaux de très bonne qualité
-
Qt Linguist : outil pour faciliter l’internationalisation des applications Qt
Les signaux et les slots
Présentation
-
Concept spécifique à Qt mais assimilable au patron de conception (→ Design pattern) “Observer/Observable”
-
Principal mode de communication entre objets héritant de
QObject:-
Un objet émet des signaux lorsqu’il change d’état
-
Un objet peut écouter des signaux à travers ses slots
→ slot = fonction appelée automatiquement en réponse à un signal
-
Le lien entre 1 signal et 1 slot se fait grâce à la méthode “connect()” (et ses variantes…) de la classe
QObject⇒
QObjectest la classe de base de pratiquement toutes les classes de Qt. C’est elle qui fournit les services de base de Qt, notamment la gestion des signaux et des slots.
-
les signaux
-
Un signal est déclaré dans la section
signalsde la définition d’une classe héritant deQObject:signals: void batteryLow(double voltage); -
Un signal est déclaré comme une fonction qui doit toujours retourner
void -
Le signal ainsi déclaré ne doit pas être codé par le programmeur. C’est l’outil
mocappelé parqmakequi s’en charge -
Un signal peut être connecté à plusieurs slots
-
Un signal est émis en utilisant le mot clé
emitemit batteryLow(12.3);
Les slots
-
Un slot est déclaré dans une section
slotsdans la définition d’une classe héritant deQObject:public slots: void unSlotPublic(); protected slots: void unSlotProtege(); private slots: void unSlotPrive(); -
Un slot peut retourner une valeur mais pas à travers la “connexion”
-
Un nombre quelconque de signaux peuvent être connectés aux slots
Il n’est pas possible de connaître l’ordre dans lequel les signaux sont émis.
-
Un slot est une méthode ordinaire :
-
codée de la même façon
-
peut être appelée normalement (i.e. sans passer par le signal)
-
Comment connecter un signal à un slot
Plusieurs méthodes possibles :
-
par Qt Designer :
la connexion signal ↔ slot se fait simplement via la correspondance entre le nom de l’expéditeur du signal et le nom du slot (→
on_<objet-émetteur>_<signal-émis>()) -
par la méthode
connect()de la classeQObjectCelle-ci autorise plusieurs syntaxes
-
avec des pointeurs de fonction
Dialog::Dialog(QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog) { ui->setupUi(this); connect(ui->btnA, &QPushButton::clicked, this, &Dialog::monSlot); } void Dialog::monSlot() { }Cette syntaxe a été introduite avec Qt5.
-
avec les macros
SIGNAL()etSLOT()Dialog::Dialog(QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog) { ui->setupUi(this); connect(ui->btnA, SIGNAL(clicked(bool)), this, SLOT(monSlot())); } void Dialog::monSlot() { }Cette méthode n’est plus recommandée même si elle est encore largement répandue.
-
avec les functors ou fonctions lambdas du C++11
Dialog::Dialog(QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog) { ui->setupUi(this); connect(ui->btnA, &QPushButton::clicked, this, [=](){ qDebug() << "btnA a été cliqué"; }); (1) }1 le code a exécuter dès que le signal survient est mis directement dans le 4ème argument de la méthode connect()
-
🞄 🞄 🞄









