Présentation du framework Qt Qu’est-ce que Qt ? C’est un framework de développement multiplateforme écrit en C++ On peut voir un framework comme une sorte de boite à outils accessible aux programmeurs pour coder des applications logicielles plus facilement. 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 : systèmes informatiques d’infodivertissement embarqués dans les voitures (Tesla, Fiat, Ford) l’industrie : Systèmes de contrôle et d’acquisition de données (→ SCADA) 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 Processus de construction d’une application 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. Déclaration d’une classe qui utilise les signaux et les slots les signaux Un signal est déclaré dans la section signals de la définition d’une classe héritant de QObject : 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é par qmake 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 de QObject : 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. Pour savoir quel est l’expéditeur du signal on peut alors utiliser la méthode sender() 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 classe QObject 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() et SLOT() 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() 🞄 🞄 🞄 Qt QML