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
⇒
QObject
est 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
signals
de 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
moc
appelé parqmake
qui s’en charge -
Un signal peut être connecté à plusieurs slots
-
Un signal est émis en utilisant le mot clé
emit
emit batteryLow(12.3);
Les slots
-
Un slot est déclaré dans une section
slots
dans 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 classeQObject
Celle-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()
-
🞄 🞄 🞄