Maîtrisez Qt
Guide de développement d'applications professionnelles
Édition Eni
Avant-propos
Chapitre 1
Introduction
1. Objectifs et méthode23
2. Glossaire25
3. Qt, qu'est-ce ?28
3.1 Histoire29
3.2 Produits et licences31
3.3 Compatibilité32
3.4 Notoriété33
3.5 Bibliothèque ou framework ?33
3.6 Documentation34
4. Connaissances requises35
4.1 UML35
4.2 Patrons de conception35
4.3 C++36
4.4 JavaScript37
5. Que peut-on faire avec Qt ?37
5.1 Le modèle d'abstraction38
5.2 Les modules de Qt40
5.3 Applications pour PC44
5.4 Applications mobiles44
5.5 Applications serveur et web services45
Chapitre 2
L'environnement de développement
1. Objectifs47
2. Licence commerciale ou libre ?47
2.1 Propriété intellectuelle et GPL50
2.2 Diffusion de l'application51
2.3 La notion de kit dans Qt52
3. Choisir son compilateur53
3.1 Mono-plateforme ou multi-plateforme ?53
3.2 Maintenabilité du code56
4. Installer l'environnement de développement57
4.1 Ordinateur personnel Mac Mx58
4.2 Ordinateur personnel sous Windows59
4.3 Mini ordinateur Raspberry Pi 4B59
4.4 Tablette Android60
4.5 Première installation60
4.6 Intégrer un autre environnement de compilation69
5. Maintenir à jour son environnement73
5.1 Profiter des dernières nouveautés76
5.2 Gérer le cycle de vie de son application78
6. Utiliser Qt Creator79
6.1 Organisation des projets79
6.2 Fenêtre principale80
6.2.1 Boutons d'accès aux modules81
6.2.2 Boutons de compilation et d'exécution81
6.2.3 Onglets de journaux82
6.3 Module d'édition87
6.4 Module de conception d'interfaces graphiques88
6.5 Module de débogage89
6.6 Module de configuration de projet91
6.7 Module de profilage96
7. Créer une application96
8. Création et gestion des ressources101
Chapitre 3
Les fondations de Qt
1. Objectifs107
2. Les Types Qt107
3. La classe QObject109
3.1 Entité et identité109
3.2 Thread principal111
3.3 Affinité de thread112
3.4 Signaux et slots116
3.4.1 Le signal118
3.4.2 Le slot118
3.4.3 La connexion119
3.4.4 Différents types de connexion122
3.4.5 L'appel125
3.4.6 Clés de compréhension128
3.5 Arbre d'objets136
3.6 Timers139
3.7 Traduction140
3.8 Propriétés dynamiques140
4. Héritage141
4.1 Généralités142
4.2 Prototype143
4.3 Conversion de types144
5. Optimisation des conteneurs145
5.1 Comptage de références147
5.2 Partage implicite151
5.3 Partage explicite152
6. La classe QVariant154
7. Gestion des erreurs156
7.1 bool *ok = 0156
7.2 error()157
8. Le modèle event-driven157
8.1 Pourquoi Qt est-il orienté événements ?158
8.2 La notion de flux160
8.3 La run-loop164
8.4 La programmation asynchrone167
8.5 Appeler une fonction de façon asynchrone169
8.5.1 L'émission de signaux171
8.5.2 L'utilisation d'un timer171
8.5.3 La fonction invokeMethod172
8.6 Suppression explicite174
8.7 Avantages et inconvénients175
8.8 Gestion des ressources et performances176
8.9 Rendre ses algorithmes non bloquants177
8.9.1 Parcourir une longue liste177
8.9.2 Faire une pause dans le programme180
8.10 Faire dialoguer des objets181
9. Les ressources187
10. Les propriétés188
Chapitre 4
Anatomie d'une application
1. Objectifs193
2. Application Widget ou Quick ?194
2.1 Application Widget194
2.2 Application Qt Quick195
2.3 Synthèse196
3. Exemples d'architectures classiques :197
3.1 Cartographie GPS197
3.2 Gestion du stock200
3.3 Tableau de bord de supervision202
4. Service de flux vidéo pour une webcam204
5. Description d'un projet Qt205
5.1 Contenu d'un projet Qt205
5.2 Création d'une application206
5.2.1 En ligne de commande206
5.2.2 Avec Qt Creator210
5.3 Le fichier projet .pro210
5.3.1 Les directives de projet211
5.3.2 Les directives de chemins211
5.3.3 Les directives de précompilation212
6. Les commandes du toolkit213
6.1 La phase de compilation .214
Chapitre 5
Qt Core
1. Objectifs215
2. Intégration et interactions215
3. Découverte de Qt Core216
3.1 Le méta-objet216
3.2 Introspection218
3.3 Le méta-type218
3.4 Instanciation dynamique219
4. Créer et piloter des threads220
4.1 Paralléliser des tâches220
4.1.1 Les threads pilotés221
4.1.2 Un exemple223
4.1.3 Les tâches simples226
4.1.4 Lancer une tâche asynchrone229
4.2 Synchronisation par blocage et protection230
4.3 Synchronisation par notification233
5. Les structures de données235
5.1 Structures unidimensionnelles235
5.2 Structures multidimensionnelles240
5.3 Rechercher les performances242
6. QByteArray243
6.1 Instanciation244
6.2 Utilisation d'un pointeur existant244
6.3 Rechercher des sous-ensembles245
6.4 Convertir un QByteArray246
7. QBuffer247
8. QString248
8.1 Les chaînes C et les langues accentuées249
8.2 Les normes ISO, Unicode, UCS249
8.3 Échanger des données252
8.4 Composer des chaînes254
8.5 Listes de chaînes de caractères254
8.6 Découper des chaînes de caractères256
8.7 Extraire une sous-chaîne256
8.8 Rechercher une sous-chaîne257
8.9 Construire une chaîne à partir d'un nombre257
8.10 Convertir une chaîne en nombre258
8.11 Connaître la taille de la chaîne258
9. Interactions avec le système d'exploitation259
9.1 Exécuter une commande externe259
9.2 Les fichiers261
10. La gestion des paramètres263
10.1 QSettings263
10.2 Une classe propriétaire265
11. La sérialisation266
11.1 Mécanismes266
11.2 Exemples269
12. Les fichiers XML270
12.1 Écrire dans un fichier XML270
12.2 Lire un fichier XML272
13. Les fichiers JSON274
13.1 Lire un fichier JSON274
13.2 Écrire dans un fichier JSON276
14. Automate à états278
14.1 Automate simple278
14.2 Collaboration entre automates281
14.3 Automate fini283
14.4 Animer les changements de propriétés283
15. Fonctions et types globaux284
15.1 Conversion d'endianisme284
15.2 Types universels286
15.3 Fonctions globales286
15.3.1 Mathématiques287
15.3.2 Utilitaires287
15.4 Macros288
15.5 Fonctions mathématiques avancées289
Chapitre 6
Qt Network
1. Objectifs291
2. Intégration291
3. Accéder au réseau292
3.1 Portée de Qt Network292
3.2 Appel bloquant vs non bloquant293
4. Sockets295
4.1 Client TCP295
4.1.1 Connexion avec un hôte296
4.1.2 Envoi d'une requête297
4.1.3 Lecture d'une réponse297
4.1.4 Fermeture et nettoyage298
4.2 Serveur TCP300
4.3 Client UDP302
4.3.1 Connexion à un hôte302
4.3.2 Envoi de données304
4.3.3 Lecture des données304
4.3.4 Fermeture de la connexion305
5. Internet305
5.1 Résolution DNS305
5.1.1 Résoudre un nom de machine306
5.1.2 Obtenir les enregistrements d'un nom de domaine307
5.2 Échange de fichiers avec FTP309
5.2.1 Client simple310
5.2.2 Client évolué312
5.3 Connexion à un serveur HTTP314
5.3.1 Création d'une requête315
5.3.2 Exécution de la requête316
5.3.3 Lecture du résultat r316
5.3.4 Authentification319
5.4 Le chiffrement avec SSL et TLS321
6. Les interfaces réseau323
7. Les objets distants324
7.1 Vocabulaire325
7.2 Mise en ouvre325
8. Mécanismes communs326
8.1 Connexion point à point328
9. Connexion via un concentrateur333
10. Communications TCP334
11. Versions du protocole335
12. Objets distants en QML335
Chapitre 7
Qt Sql
1. Objectifs337
2. Intégration338
3. Persistance des données338
3.1 Utilisation d'un serveur de données338
3.2 Ce que Qt Sql permet et ne permet pas339
3.3 Le modèle de conception approprié339
4. Connexion au serveur de données342
5. Effectuer une requête343
5.1 La requête344
5.2 Le résultat345
5.3 Le mode transactionnel346
5.4 Obtenir les métadonnées347
5.5 Rechercher les performances348
5.5.1 Préparation de la requête350
5.5.2 Exécution de la requête351
5.5.3 Stratégie d'instanciation352
Chapitre 8
Qt Gui
1. Objectifs353
2. Intégration354
3. QGuiApplication et QWindow354
3.1 QGuiApplication354
3.2 QWindow355
4. Rendu 2D356
4.1 Géométrie et positionnement357
4.2 Images358
4.2.1 QImage358
4.2.2 QPixmap360
4.3 Dessin 2D361
4.3.1 Dessiner des formes362
4.3.2 Dessiner du texte364
5. Rendu 3D365
Chapitre 9
Qt Widgets
1. Objectifs367
2. Intégration368
3. Flux d'application et de GUI369
4. Modèle objet et Vue-Modèle371
4.1 Vue-Modèle372
4.2 Architecture du code380
5. Créer avec Qt Designer381
5.1 Organisation du designer384
5.2 Mise en page385
5.2.1 Ergonomie385
5.2.2 Redimensionnement automatique386
5.2.3 Une mise en page plus complexe398
5.2.4 Modèle objet et relations405
6. Créer « à la main »405
7. Modes SDI et MDI407
8. Créer un menu412
9. Réagir aux événements414
10. Intégrer et afficher les dialogues créés417
11. Feuilles de style419
12. Gestion des événements423
13. Ressources426
13.1 Créer un fichier de ressources427
13.2 Utiliser une ressource dans le designer428
13.3 Accéder à une ressource depuis le code429
14. Widgets personnalisés430
15. Icône de notification (Tray icon)433
16. Composants graphiques 2D437
17. Drag and Drop440
17.1 Initialisation des widgets441
17.2 Mise en place du drag442
17.3 Mise en place du drop444
18. Copier-coller445
19. Ouvrir et enregistrer des fichiers446
20. Généraliser les styles448
Chapitre 10
Qt Quick
1. Objectifs449
2. Intégration450
3. La terminologie de Qt Quick451
4. Le modèle objet de Qt Quick452
5. Le document QML453
5.1 La déclaration pragma (optionnelle)455
5.2 Les imports455
5.3 L'objet racine456
5.4 Les propriétés457
5.4.1 Les propriétés attachées459
5.4.2 Les propriétés par défaut460
5.4.3 Les propriétés obligatoires462
5.5 Les signaux462
5.6 Les slots463
5.7 Les fonctions JavaScript en ligne465
5.8 Les fichiers JavaScript465
5.9 Les objets enfants466
6. Structure d'un projet Qt Quick467
7. Mettre en forme une scène469
7.1 Le positionnement absolu471
7.2 Les layouts473
7.3 Les positionneurs475
7.4 Les ancres476
8. Vue et contrôleur482
9. États et transitions484
10. Animations et effets486
10.1 Animations488
11. Dessin 2D avec le Canvas491
12. Contrôles riches495
13. Utiliser les styles graphiques498
13.1 Le style « basique »499
13.2 Le style « Fusion »500
13.3 Le style « Imagine »500
13.4 Le style « macOS »501
13.5 Le style « Material »502
13.6 Le style « Universal »502
13.7 Le style « Windows »503
13.8 Utiliser un style504
13.8.1 À la compilation504
13.8.2 Pendant l'exécution504
14. Formes graphiques505
15. Effets graphiques505
16. Types globaux de Qt Quick509
16.1 Les propriétés du Type global Qt512
16.2 Les fonctions du type global Qt513
16.3 Le Type QML Application515
17. Créer ses propres Types QML517
18. L'intégration avec C++520
18.1 Exposer des classes C+ + en QML521
18.1.1 Méthodes alternatives528
18.2 Propriété des objets530
18.3 Intégrer des bibliothèques externes531
19. Stocker des données535
19.1 Le Type QML Settings535
19.2 Le Type LocalStorage537
20. Créer des requêtes réseau539
20.1 Utiliser des composants QML distants539
20.2 Effectuer des requêtes HTTP541
20.3 Charger des fichiers locaux542
20.4 Utiliser les WebSockets542
21. Autres API544
22. Qt Design Studio544
22.1 Découverte de l'interface546
22.2 Création d'un projet548
22.2.1 Les composants invisibles556
22.2.2 Les données556
23. Convertir un projet d'interface graphique en application558
24. Créer les contrôleurs et tester l'application559
24.1 Le contrôleur559
24.2 Réaction aux événements563
24.3 Déclenchement des actions565
24.4 Conception rapide d'une application567
24.4.1 Définir un flux applicatif567
24.4.2 Appliquer des effets aux transitions.573
24.4.3 Personnaliser les courbes de progression575
24.4.4 Établir des conditions dans les transitions577
24.4.5 Changer l'état d'un composant578
24.5 Conception d'animations579
Chapitre 11
Qt Multimedia
1. Objectifs585
2. Intégration586
3. Audio586
3.1 Lister les périphériques586
3.2 Enregistrer du son588
3.3 Lire un fichier589
4. Vidéo591
4.1 Enregistrer une vidéo591
4.2 Lire une vidéo592
5. Caméra593
5.1 Afficher en direct593
5.2 Enregistrer en direct594
6. Radio595
6.1 Lire un flux radio596
6.2 Enregistrer un flux radio598
Chapitre 12
Les modules graphiques et web
1. Objectifs599
2. Qt Svg599
2.1 Intégration599
2.2 Rendu et affichage600
2.3 Exporter au format SVG600
3. QtPrintSupport602
3.1 Intégration602
3.2 Choisir l'imprimante602
3.3 Imprimer un dessin603
3.4 Imprimer un widget605
3.5 Imprimer du texte605
4. QtWebkitWidgets606
4.1 Intégration606
4.2 Afficher une page web606
4.3 Accéder au DOM608
4.4 Bases de données HTML 5611
5. Qt Charts612
5.1 Installation612
5.2 Licences612
5.3 Intégration613
5.4 Présentation613
5.5 Principe général613
5.6 Créer un diagramme en C + +614
5.7 Créer un diagramme en QML615
5.8 Diagramme à barres616
5.8.1 C+ +616
5.8.2 QML616
5.8.3 Variantes617
5.9 Diagramme circulaire619
5.9.1 C+ +619
5.9.2 QML620
5.9.3 Variantes620
5.10 Diagramme à lignes621
5.10.1 C + +621
5.10.2 QML622
5.11 Diagramme à surface622
5.11.1 C + +623
5.11.2 QML624
5.12 Diagramme à points624
5.12.1 C + +625
5.12.2 QML625
5.13 Diagramme à chandelles626
5.13.1 C+ +626
5.13.2 QML627
5.14 Combiner les diagrammes628
5.15 Modifier la légende629
5.16 Manipuler les axes630
5.17 Utiliser des thèmes de couleurs631
5.18 Interagir avec un diagramme632
Chapitre 13
API pour les plateformes mobiles
1. Objectifs635
2. Intégration635
3. L'environnement de développement636
3.1 Préparation636
3.2 Configuration637
4. Exécution d'une application639
5. Capteurs645
5.1 Utilisation générique646
5.2 Obtenir la liste des capteurs disponibles647
5.3 Lire les valeurs d'un capteur648
5.4 Lecture asynchrone649
5.5 Filtrer les données649
6. Positionnement650
6.1 Cas d'usage651
6.1.1 Position courante en C+ +651
6.1.2 Position courante en QML652
7. Cartographie653
7.1 Cartes et navigation654
7.1.1 Afficher un plan en QML654
7.1.2 Changer le type de carte657
7.2 Lieux et points d'intérêt659
7.2.1 Afficher la position courante659
7.2.2 Utiliser une adresse postale659
7.2.3 Mettre en évidence un point d'intérêt661
7.2.4 Calculer un itinéraire663
8. Bluetooth667
8.1 Cas d'utilisation667
8.1.1 Obtenir des informations sur le périphérique Bluetooth667
8.1.2 Rechercher des appareils distants668
8.1.3 Envoyer un fichier668
8.1.4 Échanger en direct entre périphériques669
8.1.5 Envoyer des notifications par Bluetooth LE672
9. NFC673
9.1 Cas d'utilisation673
9.1.1 Recevoir des tags NFC673
9.1.2 Envoyer un message675
10. Achats in-app676
10.1 Cas d'utilisation676
10.1.1 Enregistrer des achats in-app676
10.1.2 Effectuer un achat679
10.1.3 Restaurer les achats précédents680
Chapitre 14
Qt Test - qualité du code
1. Objectifs681
2. Intégration682
3. Scénario de tests682
4. Tests unitaires et couverture de code685
4.1 Les assertions686
4.2 Exécution des tests687
4.3 Diversifier les données689
4.4 Événements GUI691
4.5 Tester les performances693
5. Non-régression694
Chapitre 15
Traduction d'une application
1. Objectifs695
2. Cycle de traduction695
3. Rendre traduisible son application697
3.1 Code source697
3.2 Vues699
4. Traduire son application700
4.1 Langue et région700
4.2 Traduction de l'application701
4.2.1 Exportation des textes701
4.2.2 Traduction des textes701
4.2.3 Compilation des traductions704
4.3 Intégration des traductions704
5. Contexte de traduction706
Chapitre 16
Publication d'une application
1. Objectifs707
2. Comprendre les licences708
3. Les dépendances710
4. Créer un installeur universel711
5. Créer un installeur spécifique à Windows712
5.1 Programme compilé avec Microsoft Visual C+ +713
5.2 Programme compilé avec mingw714
6. Créer un installeur pour OS X714
6.1 Bundle715
6.1.1 Création715
6.1.2 Signature716
6.2 Fichier DMG717
6.3 Paquet d'installation719
7. Créer un paquet pour Debian/Ubuntu719
7.1 Arborescence720
7.2 Fichier de contrôle721
7.3 Création du paquet722
8. Inclure les plug-ins de Qt723
8.1 Windows723
8.2 OS X723
8.3 GNU/Linux724
9. Tester son application724
Chapitre 17
Application de A à Z
1. Objectifs725
2. Analyse du besoin726
3. Analyse technique726
4. Codage727
4.1 Les tests unitaires728
4.2 Les classes C++729
4.2.1 Le format de message729
4.2.2 La classe Message730
4.2.3 L'outillage de formatage des messages732
4.2.4 La fabrique à messages733
4.2.5 Le Contrôleur réseau734
4.2.6 Exposition du Contrôleur en QML738
4.3 Les fichiers QML739
4.3.1 Le point d'entrée App.qml739
4.3.2 La Vue de chat740
4.3.3 La Vue des participants743
5. Traduction745
5.1 Les tests unitaires (suite)748
6. Compilation sur smartphone750
6.1 Smartphone iOS750
6.2 Smartphone Android753
6.3 Tests finaux761
7. Finalisation et empaquetage762
7.1 Préparation de l'application764
7.2 Création du projet d'installeur765
Chapitre 18
Techniques d'optimisation
1. Objectifs767
2. Langages et mode de pensée769
3. Notions de C+ + indispensables772
3.1 Pointeurs et références772
3.1.1 Pointeurs C772
3.1.2 Références774
3.2 Copie d'objets776
3.2.1 Copie superficielle (shallow copy)776
3.2.2 Copie en profondeur (deep copy)778
3.2.3 Copie paresseuse (lazy copy)780
3.2.4 Partage implicite783
4. Optimisations785
4.1 Le modèle objet787
4.2 Le cycle de vie des objets788
4.3 Les classes optimisées791
4.3.1 QByteArray791
4.3.2 QStringRef793
4.4 Optimiser l'utilisation du processeur795
5. Quelques particularités de Qt797
5.1 Types primitifs797
5.2 Gestion de la mémoire798
5.2.1 Cycle de vie798
5.2.2 Structures de données799
5.3 STL, Boost et Qt800
5.4 Réentrance801
5.5 Exceptions802
6. Lectures complémentaires804
Index805