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).

    rpi
  • 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

    qt modules

Qui utilise Qt ?

Qt est utilisé dans plusieurs domaines :

  1. les systèmes d’exploitation → environnement de bureau KDE

  2. 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

    • …​

  3. les systèmes embarqués :

    • systèmes informatiques d’infodivertissement embarqués dans les voitures (Tesla, Fiat, Ford)

      QtAS
  4. l’industrie :

    • Systèmes de contrôle et d’acquisition de données (→ SCADA)

      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 designer
  • 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

qt build

Les signaux et les slots

Présentation

signaux slots
  • 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

ma classe

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()

    qt 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 :

  1. par Qt Designer :

    qt designer go to slot

    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>())

  2. par la méthode connect() de la classe QObject

    Celle-ci autorise plusieurs syntaxes

    1. 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.

    2. 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.

    3. 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()

🞄  🞄  🞄