Changeset 846 for trunk/doc/src/tutorials/addressbook-fr.qdoc
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/doc/src/tutorials/addressbook-fr.qdoc
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 7 7 ** This file is part of the documentation of the Qt Toolkit. 8 8 ** 9 ** $QT_BEGIN_LICENSE: LGPL$9 ** $QT_BEGIN_LICENSE:FDL$ 10 10 ** Commercial Usage 11 11 ** Licensees holding valid Qt Commercial licenses may use this file in 12 12 ** accordance with the Qt Commercial License Agreement provided with the 13 ** Software or, alternatively, in accordance with the terms contained in 14 ** awritten agreement between you and Nokia.13 ** Software or, alternatively, in accordance with the terms contained in a 14 ** written agreement between you and Nokia. 15 15 ** 16 ** GNU Lesser General Public License Usage 17 ** Alternatively, this file may be used under the terms of the GNU Lesser 18 ** General Public License version 2.1 as published by the Free Software 19 ** Foundation and appearing in the file LICENSE.LGPL included in the 20 ** packaging of this file. Please review the following information to 21 ** ensure the GNU Lesser General Public License version 2.1 requirements 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 23 ** 24 ** In addition, as a special exception, Nokia gives you certain additional 25 ** rights. These rights are described in the Nokia Qt LGPL Exception 26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 27 ** 28 ** GNU General Public License Usage 29 ** Alternatively, this file may be used under the terms of the GNU 30 ** General Public License version 3.0 as published by the Free Software 31 ** Foundation and appearing in the file LICENSE.GPL included in the 32 ** packaging of this file. Please review the following information to 33 ** ensure the GNU General Public License version 3.0 requirements will be 34 ** met: http://www.gnu.org/copyleft/gpl.html. 16 ** GNU Free Documentation License 17 ** Alternatively, this file may be used under the terms of the GNU Free 18 ** Documentation License version 1.3 as published by the Free Software 19 ** Foundation and appearing in the file included in the packaging of this 20 ** file. 35 21 ** 36 22 ** If you have questions regarding the use of this file, please contact … … 43 29 \page tutorials-addressbook-fr.html 44 30 45 \startpage {index.html}{Qt Reference Documentation}46 \contentspage Tutorials47 \nextpage {tutorials/addressbook-fr/part1}{Chapitre 1}48 49 31 \title Tutoriel "Carnet d'adresses" 50 \brief Une introduction àla programation d'interface graphique montrant comment construire une application simple avec Qt.51 52 Ce tutoriel est une introduction àla programmation de GUI (interface utilisateur)53 àl'aide des outils fournis par la plateforme multiplate-forme Qt.32 \brief Une introduction à la programation d'interface graphique montrant comment construire une application simple avec Qt. 33 34 Ce tutoriel est une introduction à la programmation de GUI (interface utilisateur) 35 à l'aide des outils fournis par la plateforme multiplate-forme Qt. 54 36 55 37 \image addressbook-tutorial-screenshot.png 56 38 57 Ce tutoriel va nous amener à découvrir quelques technologies fondamentales fournies39 Ce tutoriel va nous amener à découvrir quelques technologies fondamentales fournies 58 40 par Qt, tel que: 59 41 60 42 \list 61 \o Les Widgets et leur mise en page àl'aide des layouts43 \o Les Widgets et leur mise en page à l'aide des layouts 62 44 \o Les signaux et slots 63 \o Les structures de donn ées de collections64 \o Les entr ées/sorties45 \o Les structures de données de collections 46 \o Les entrées/sorties 65 47 \endlist 66 48 67 49 Si c'est votre premier contact avec Qt, lisez \l{How to Learn Qt}{Comment apprendre Qt} 68 si ce n'est d éjàfait.69 70 Le code source du tutoriel est distribu éavec Qt dans le dossier \c examples/tutorials/addressbook50 si ce n'est déjà fait. 51 52 Le code source du tutoriel est distribué avec Qt dans le dossier \c examples/tutorials/addressbook 71 53 72 54 Les chapitres du tutoriel: … … 75 57 \o \l{tutorials/addressbook-fr/part1}{Conception de l'interface utilisateur} 76 58 \o \l{tutorials/addressbook-fr/part2}{Ajouter des adresses} 77 \o \l{tutorials/addressbook-fr/part3}{Navigation entre les éléments}78 \o \l{tutorials/addressbook-fr/part4}{ éditer et supprimer des adresses}59 \o \l{tutorials/addressbook-fr/part3}{Navigation entre les éléments} 60 \o \l{tutorials/addressbook-fr/part4}{éditer et supprimer des adresses} 79 61 \o \l{tutorials/addressbook-fr/part5}{Ajout d'une fonction de recherche} 80 62 \o \l{tutorials/addressbook-fr/part6}{Sauvegarde et chargement} 81 \o \l{tutorials/addressbook-fr/part7}{Fonctionnalit és avancées}63 \o \l{tutorials/addressbook-fr/part7}{Fonctionnalités avancées} 82 64 \endlist 83 65 84 La petite application que nous d évelopperons ici ne possède pas tous les éléments66 La petite application que nous développerons ici ne possÚde pas tous les éléments 85 67 des interfaces dernier cri, elle va nous permettre d'utiliser les techniques de base 86 utilis ées dans les applications plus complexes.87 88 Lorsque vous aurez termin éce tutoriel, nous vous recommandons de poursuivre avec l'exemple89 "\l{mainwindows/application}{Application}", qui pr ésente une interface simple utilisant90 les menus et barres d'outils, la barre d' état, etc.68 utilisées dans les applications plus complexes. 69 70 Lorsque vous aurez terminé ce tutoriel, nous vous recommandons de poursuivre avec l'exemple 71 "\l{mainwindows/application}{Application}", qui présente une interface simple utilisant 72 les menus et barres d'outils, la barre d'état, etc. 91 73 92 74 */ … … 94 76 /*! 95 77 \page tutorials-addressbook-fr-part1.html 96 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 97 \nextpage {tutorials/addressbook-fr/part2}{Chapitre 2} 78 98 79 \example tutorials/addressbook-fr/part1 99 80 \title Carnet d'adresses 1 - Conception de l'interface utilisateur 100 81 101 La premi ère partie de ce tutoriel traite de la conception d'une interface graphique82 La premiÚre partie de ce tutoriel traite de la conception d'une interface graphique 102 83 (GUI) basique, que l'on utilisera pour l'application Carnet d'adresses. 103 84 104 La premi ère étape dans la création d'applications graphiques est la conception de105 l'interface utilisateur. Dans ce chapitre, nous verrons comment cr éer les labels106 et champs de saisie n écessaires àl'implementation d'un carnet d'adresses de base.107 Le r ésultat attendu est illustré par la capture d'écran ci-dessous.85 La premiÚre étape dans la création d'applications graphiques est la conception de 86 l'interface utilisateur. Dans ce chapitre, nous verrons comment créer les labels 87 et champs de saisie nécessaires à l'implementation d'un carnet d'adresses de base. 88 Le résultat attendu est illustré par la capture d'écran ci-dessous. 108 89 109 90 \image addressbook-tutorial-part1-screenshot.png … … 111 92 Nous allons avoir besoin de deux objets QLabel, \c nameLabel et \c addressLabel, 112 93 ainsi que deux champs de saisie: un objet QLineEdit, \c nameLine, et un objet 113 QTextEdit, \c addressText, afin de permettre àl'utilisateur d'entrer le nom d'un114 contact et son adresse. Les widgets utilis és ainsi que leur placement sont visibles ci-dessous.94 QTextEdit, \c addressText, afin de permettre à l'utilisateur d'entrer le nom d'un 95 contact et son adresse. Les widgets utilisés ainsi que leur placement sont visibles ci-dessous. 115 96 116 97 \image addressbook-tutorial-part1-labeled-screenshot.png 117 98 118 Trois fichiers sont n écessaires à l'implémentation de ce carnet d'adresses:99 Trois fichiers sont nécessaires à l'implémentation de ce carnet d'adresses: 119 100 120 101 \list 121 \o \c{addressbook.h} - le fichier de d éfinition (header) pour la classe \c AddressBook,122 \o \c{addressbook.cpp} - le fichier source, qui comprend l'impl émentation de la classe102 \o \c{addressbook.h} - le fichier de définition (header) pour la classe \c AddressBook, 103 \o \c{addressbook.cpp} - le fichier source, qui comprend l'implémentation de la classe 123 104 \c AddressBook 124 \o \c{main.cpp} - le fichier qui contient la m éthode \c main() , et105 \o \c{main.cpp} - le fichier qui contient la méthode \c main() , et 125 106 une instance de la classe \c AddressBook. 126 107 \endlist 127 108 128 \section1 Programmation en Qt - h éritage129 130 131 Lorsque l'on écrit des programmes avec Qt, on a généralement recours à132 l'h éritage depuis des objets Qt, afin d'y ajouter des fonctionnalités.133 C'est l'un des concepts fondamentaux de la cr éation de widgets personnalisés134 ou de collections de widgets. Utiliser l'h éritage afin de compléter135 ou modifier le comportement d'un widget pr ésente les avantages suivants:109 \section1 Programmation en Qt - héritage 110 111 112 Lorsque l'on écrit des programmes avec Qt, on a généralement recours à 113 l'héritage depuis des objets Qt, afin d'y ajouter des fonctionnalités. 114 C'est l'un des concepts fondamentaux de la création de widgets personnalisés 115 ou de collections de widgets. Utiliser l'héritage afin de compléter 116 ou modifier le comportement d'un widget présente les avantages suivants: 136 117 137 118 \list 138 \o La possibilit é d'implémenter des méthodes virtuelles et des méthodes139 virtuelles pures pour obtenir exactement ce que l'on souhaite, avec la possibilit é140 d'utiliser l'impl émentation de la classe mère si besoin est.119 \o La possibilité d'implémenter des méthodes virtuelles et des méthodes 120 virtuelles pures pour obtenir exactement ce que l'on souhaite, avec la possibilité 121 d'utiliser l'implémentation de la classe mÚre si besoin est. 141 122 \o Cela permet l'encapsulation partielle de l'interface utilisateur dans une classe, 142 afin que les autres parties de l'application n'aient pas àse soucier de chacun des123 afin que les autres parties de l'application n'aient pas à se soucier de chacun des 143 124 widgets qui forment l'interface utilisateur. 144 \o La classe fille peut être utilisée pour créer de nombreux widgets personnalisés145 dans une m ême application ou bibliothèque, et le code de la classe fille peut être146 r éutilisédans d'autres projets125 \o La classe fille peut être utilisée pour créer de nombreux widgets personnalisés 126 dans une même application ou bibliothÚque, et le code de la classe fille peut être 127 réutilisé dans d'autres projets 147 128 \endlist 148 129 149 130 Comme Qt ne fournit pas de widget standard pour un carnet d'adresses, nous 150 partirons d'une classe de widget Qt standard et y ajouterons des fonctionnalit és.151 La classe \c AddressBook cr ée dans ce tutoriel peut être réutilisée si on a besoin d'un131 partirons d'une classe de widget Qt standard et y ajouterons des fonctionnalités. 132 La classe \c AddressBook crée dans ce tutoriel peut être réutilisée si on a besoin d'un 152 133 widget carnet d'adresses basique. 153 134 … … 156 137 157 138 Le fichier \l{tutorials/addressbook-fr/part1/addressbook.h}{\c addressbook.h} permet de 158 d éfinir la classe \c AddressBook.159 160 On commence par d éfinir \c AddressBook comme une classe fille de QWidget et déclarer161 un constructeur. On utilise également la macro Q_OBJECT pour indiquer que la classe162 exploite les fonctionnalit és de signaux et slots offertes par Qt ainsi que163 l'internationalisation, bien que nous ne les utilisions pas àce stade.139 définir la classe \c AddressBook. 140 141 On commence par définir \c AddressBook comme une classe fille de QWidget et déclarer 142 un constructeur. On utilise également la macro Q_OBJECT pour indiquer que la classe 143 exploite les fonctionnalités de signaux et slots offertes par Qt ainsi que 144 l'internationalisation, bien que nous ne les utilisions pas à ce stade. 164 145 165 146 \snippet tutorials/addressbook-fr/part1/addressbook.h class definition 166 147 167 La classe contient les d éclarations de \c nameLine et \c addressText,168 les instances priv ées de QLineEdit et QTextEdit mentionnées précédemment.169 Vous verrez, dans les chapitres àvenir que les informations contenues170 dans \c nameLine et \c addressText sont n écessaires à de nombreuses méthodes148 La classe contient les déclarations de \c nameLine et \c addressText, 149 les instances privées de QLineEdit et QTextEdit mentionnées précédemment. 150 Vous verrez, dans les chapitres à venir que les informations contenues 151 dans \c nameLine et \c addressText sont nécessaires à de nombreuses méthodes 171 152 du carnet d'adresses. 172 153 173 Il n'est pas n écessaire de déclarer les objets QLabel que nous allons utiliser174 puisque nous n'aurons pas besoin d'y faire r éférence après leur création.175 La fa çon dont Qt gère la parenté des objets est traitée dans la section suivante.176 177 La macro Q_OBJECT impl émente des fonctionnalités parmi les plus avancées de Qt.154 Il n'est pas nécessaire de déclarer les objets QLabel que nous allons utiliser 155 puisque nous n'aurons pas besoin d'y faire référence aprÚs leur création. 156 La façon dont Qt gÚre la parenté des objets est traitée dans la section suivante. 157 158 La macro Q_OBJECT implémente des fonctionnalités parmi les plus avancées de Qt. 178 159 Pour le moment, il est bon de voir la macro Q_OBJECT comme un raccourci nous 179 permettant d'utiliser les m éthodes \l{QObject::}{tr()} et \l{QObject::}{connect()}.180 181 Nous en avons maintenant termin éavec le fichier \c addressbook.h et allons182 passer à l'implémentation du fichier \c addressbook.cpp.183 184 \section1 Impl émentation de la classe AddressBook185 186 Le constructeur de la classe \c{AddressBook} prend en param ètre un QWidget, \e parent.187 Par convention, on passe ce param ètre au constructeur de la classe mère.188 Ce concept de parent é, oùun parent peut avoir un ou plusieurs enfants, est utile189 pour regrouper les Widgets avec Qt. Par exemple, si vous d étruisez le parent,190 tous ses enfants seront d étruits égalament.160 permettant d'utiliser les méthodes \l{QObject::}{tr()} et \l{QObject::}{connect()}. 161 162 Nous en avons maintenant terminé avec le fichier \c addressbook.h et allons 163 passer à l'implémentation du fichier \c addressbook.cpp. 164 165 \section1 Implémentation de la classe AddressBook 166 167 Le constructeur de la classe \c{AddressBook} prend en paramÚtre un QWidget, \e parent. 168 Par convention, on passe ce paramÚtre au constructeur de la classe mÚre. 169 Ce concept de parenté, où un parent peut avoir un ou plusieurs enfants, est utile 170 pour regrouper les Widgets avec Qt. Par exemple, si vous détruisez le parent, 171 tous ses enfants seront détruits égalament. 191 172 192 173 193 174 \snippet tutorials/addressbook/part1/addressbook.cpp constructor and input fields 194 175 195 à l'intérieur de ce constructeur, on déclare et instancie deux objets locaux196 QLabel, \c nameLabel et \c addressLabel, de m ême on instancie \c nameLine et197 \c addressText. La m éthode \l{QObject::tr()}{tr()} renvoie une version traduite198 de la cha îne de caractères, si elle existe; dans le cas contraire, elle renvoie199 la cha îne elle même. On peut voir cette méthode comme un marqueur \tt{<insérer200 la traduction ici>}, permettant de rep érer les objets QString à considérer201 pour traduire une application. Vous remarquerez, dans les chapitres àvenir202 comme dans les \l{Qt Examples}{exemples Qt}, qu'elle est utilis ée chaque fois203 que l'on utilise une cha îne susceptible d'être traduite.176 à l'intérieur de ce constructeur, on déclare et instancie deux objets locaux 177 QLabel, \c nameLabel et \c addressLabel, de même on instancie \c nameLine et 178 \c addressText. La méthode \l{QObject::tr()}{tr()} renvoie une version traduite 179 de la chaîne de caractÚres, si elle existe; dans le cas contraire, elle renvoie 180 la chaîne elle même. On peut voir cette méthode comme un marqueur \tt{<insérer 181 la traduction ici>}, permettant de repérer les objets QString à considérer 182 pour traduire une application. Vous remarquerez, dans les chapitres à venir 183 comme dans les \l{Qt Examples}{exemples Qt}, qu'elle est utilisée chaque fois 184 que l'on utilise une chaîne susceptible d'être traduite. 204 185 205 186 Lorsque l'on programme avec Qt, il est utile de savoir comment fonctionnent les 206 187 agencements ou layouts. Qt fournit trois classes principales de layouts pour 207 contr ôler le placement des widgets: QHBoxLayout, QVBoxLayout et QGridLayout.188 contrÃŽler le placement des widgets: QHBoxLayout, QVBoxLayout et QGridLayout. 208 189 209 190 \image addressbook-tutorial-part1-labeled-layout.png 210 191 211 On utilise un QGridLayout pour positionner nos labels et champs de saisie de mani ère212 structur ée. QGridLayout divise l'espace disponible en une grille, et place les213 widgets dans les cellules que l'on sp écifie par les numéros de ligne et de colonne.214 Le diagramme ci-dessus pr ésente les cellules et la position des widgets, et cette215 organisation est obtenue àl'aide du code suivant:192 On utilise un QGridLayout pour positionner nos labels et champs de saisie de maniÚre 193 structurée. QGridLayout divise l'espace disponible en une grille, et place les 194 widgets dans les cellules que l'on spécifie par les numéros de ligne et de colonne. 195 Le diagramme ci-dessus présente les cellules et la position des widgets, et cette 196 organisation est obtenue à l'aide du code suivant: 216 197 217 198 \snippet tutorials/addressbook/part1/addressbook.cpp layout 218 199 219 On remarque que le label \c AddressLabel est positionn éen utilisant Qt::AlignTop220 comme argument optionnel. Ceci est destin é à assurer qu'il ne sera pas centré221 verticalement dans la cellule (1,0). Pour un aper çu rapide des layouts de Qt,200 On remarque que le label \c AddressLabel est positionné en utilisant Qt::AlignTop 201 comme argument optionnel. Ceci est destiné à assurer qu'il ne sera pas centré 202 verticalement dans la cellule (1,0). Pour un aperçu rapide des layouts de Qt, 222 203 consultez la section \l{Layout Management}. 223 204 224 Afin d'installer l'objet layout dans un widget, il faut appeler la m éthode205 Afin d'installer l'objet layout dans un widget, il faut appeler la méthode 225 206 \l{QWidget::setLayout()}{setLayout()} du widget en question: 226 207 227 208 \snippet tutorials/addressbook/part1/addressbook.cpp setting the layout 228 209 229 Enfin, on initialise le titre du widget à"Simple Address Book"230 231 \section1 Ex écution de l'application232 233 Un fichier s éparé, \c main.cpp, est utilisé pour la méthode \c main(). Dans cette234 fonction, on cr ée une instance de QApplication, \c app. QApplication se charge de235 des ressources communes àl'ensemble de l'application, tel que les polices de236 caract ères et le curseur par défaut, ainsi que de l'exécution de la boucle d'évènements.210 Enfin, on initialise le titre du widget à "Simple Address Book" 211 212 \section1 Exécution de l'application 213 214 Un fichier séparé, \c main.cpp, est utilisé pour la méthode \c main(). Dans cette 215 fonction, on crée une instance de QApplication, \c app. QApplication se charge de 216 des ressources communes à l'ensemble de l'application, tel que les polices de 217 caractÚres et le curseur par défaut, ainsi que de l'exécution de la boucle d'évÚnements. 237 218 De ce fait, il y a toujours un objet QApplication dans toute application graphique en Qt. 238 219 … … 240 221 241 222 On construit un nouveau widget \c AddressBook sur la pile et on invoque 242 sa m éthode \l{QWidget::show()}{show()} pour l'afficher.243 Cependant, le widget ne sera pas visible tant que la boucle d' évènements244 n'aura pas été lancée. On démarre la boucle d'évènements en appelant la245 m éthode \l{QApplication::}{exec()} de l'application; le résultat renvoyé246 par cette m éthode est lui même utilisé comme valeur de retour pour la méthode223 sa méthode \l{QWidget::show()}{show()} pour l'afficher. 224 Cependant, le widget ne sera pas visible tant que la boucle d'évÚnements 225 n'aura pas été lancée. On démarre la boucle d'évÚnements en appelant la 226 méthode \l{QApplication::}{exec()} de l'application; le résultat renvoyé 227 par cette méthode est lui même utilisé comme valeur de retour pour la méthode 247 228 \c main(). 248 On comprend maintenant pourquoi \c AddressBook a été créé sur la pile: àla fin229 On comprend maintenant pourquoi \c AddressBook a été créé sur la pile: à la fin 249 230 du programme, l'objet sort du scope de la fonction \c main() et tous ses widgets enfants 250 sont supprim és, assurant ainsi qu'il n'y aura pas de fuites de mémoire.231 sont supprimés, assurant ainsi qu'il n'y aura pas de fuites de mémoire. 251 232 */ 252 233 253 234 /*! 254 235 \page tutorials-addressbook-fr-part2.html 255 \previouspage {tutorials/addressbook-fr/part1}{Chapitre 1} 256 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 257 \nextpage {tutorials/addressbook-fr/part3}{Chapitre 3} 236 258 237 \example tutorials/addressbook-fr/part2 259 238 \title Carnet d'adresses 2 - Ajouter des adresses 260 239 261 La prochaine étape pour créer notre carnet d'adresses est d'ajouter un soupçon262 d'interactivit é.240 La prochaine étape pour créer notre carnet d'adresses est d'ajouter un soupçon 241 d'interactivité. 263 242 264 243 \image addressbook-tutorial-part2-add-contact.png 265 244 266 245 Nous allons fournir un bouton que l'utilisateur peut 267 cliquer pour ajouter un nouveau contact. Une structure de donn ées est aussi268 n écessaire afin de pouvoir stocker les contacts en mémoire.269 270 \section1 D éfinition de la classe AddressBook246 cliquer pour ajouter un nouveau contact. Une structure de données est aussi 247 nécessaire afin de pouvoir stocker les contacts en mémoire. 248 249 \section1 Définition de la classe AddressBook 271 250 272 251 Maintenant que nous avons mis en place les labels et les champs de saisie, 273 nous ajoutons les boutons pour compl éter le processus d'ajout d'un contact.252 nous ajoutons les boutons pour compléter le processus d'ajout d'un contact. 274 253 Cela veut dire que notre fichier \c addressbook.h a maintenant trois 275 254 objets QPushButton et trois slots publics correspondant. … … 277 256 \snippet tutorials/addressbook/part2/addressbook.h slots 278 257 279 Un slot est une m éthode qui répond àun signal. Nous allons280 voir ce concept en d étail lorsque nous implémenterons la classe \c{AddressBook}.281 Pour une explication d étaillée du concept de signal et slot, vous pouvez282 vous r éférer au document \l{Signals and Slots}.258 Un slot est une méthode qui répond à un signal. Nous allons 259 voir ce concept en détail lorsque nous implémenterons la classe \c{AddressBook}. 260 Pour une explication détaillée du concept de signal et slot, vous pouvez 261 vous référer au document \l{Signals and Slots}. 283 262 284 263 Les trois objets QPushButton \c addButton, \c submitButton et \c cancelButton 285 sont maintenant inclus dans la d éclaration des variables privées, avec286 \c nameLine et \c addressText du chapitre pr écédent.264 sont maintenant inclus dans la déclaration des variables privées, avec 265 \c nameLine et \c addressText du chapitre précédent. 287 266 288 267 \snippet tutorials/addressbook/part2/addressbook.h pushbutton declaration 289 268 290 269 Nous avons besoin d'un conteneur pour stocker les contacts du carnet 291 d'adresses, de fa çon à pouvoir les énumérer et les afficher.292 Un objet QMap, \c contacts, est utilis é pour ça, car il permet de stocker293 des paires cl é-valeur: le nom du contact est la \e{clé} et l'adresse du contact270 d'adresses, de façon à pouvoir les énumérer et les afficher. 271 Un objet QMap, \c contacts, est utilisé pour ça, car il permet de stocker 272 des paires clé-valeur: le nom du contact est la \e{clé} et l'adresse du contact 294 273 est la \e{valeur}. 295 274 296 275 \snippet tutorials/addressbook/part2/addressbook.h remaining private variables 297 276 298 Nous d éclarons aussi deux objects QString privés: \c oldName et \c oldAddress.299 Ces objets sont n écessaires pour conserver le nom et l'adresse du dernier contact300 affich é avant que l'utilisateur ne clique sur le bouton "Add". Grâce àces variables277 Nous déclarons aussi deux objects QString privés: \c oldName et \c oldAddress. 278 Ces objets sont nécessaires pour conserver le nom et l'adresse du dernier contact 279 affiché avant que l'utilisateur ne clique sur le bouton "Add". Grâce à ces variables 301 280 si l'utilisateur clique sur "Cancel", il est possible de revenir 302 àl'affichage du dernier contact.303 304 \section1 Impl émentation de la classe AddressBook281 à l'affichage du dernier contact. 282 283 \section1 Implémentation de la classe AddressBook 305 284 306 285 Dans le constructeur de \c AddressBook, \c nameLine et 307 \c addressText sont mis en mode lecture seule, de fa çon àautoriser l'affichage286 \c addressText sont mis en mode lecture seule, de façon à autoriser l'affichage 308 287 mais pas la modification du contact courant. 309 288 … … 318 297 \snippet tutorials/addressbook/part2/addressbook.cpp pushbutton declaration 319 298 320 Le bouton \c addButton est affich é en invoquant la méthode \l{QPushButton::show()}321 {show()}, tandis que \c submitButton et \c cancelButton sont cach és en invoquant322 \l{QPushButton::hide()}{hide()}. Ces deux boutons ne seront affich és que lorsque323 l'utilisateur cliquera sur "Add", et ceci est g éré par la méthode \c addContact()324 d écrite plus loin.299 Le bouton \c addButton est affiché en invoquant la méthode \l{QPushButton::show()} 300 {show()}, tandis que \c submitButton et \c cancelButton sont cachés en invoquant 301 \l{QPushButton::hide()}{hide()}. Ces deux boutons ne seront affichés que lorsque 302 l'utilisateur cliquera sur "Add", et ceci est géré par la méthode \c addContact() 303 décrite plus loin. 325 304 326 305 \snippet tutorials/addressbook/part2/addressbook.cpp connecting signals and slots 327 306 328 307 Nous connectons le signal \l{QPushButton::clicked()}{clicked()} de chaque bouton 329 au slot qui g èrera l'action.308 au slot qui gÚrera l'action. 330 309 L'image ci-dessous illustre ceci: 331 310 … … 337 316 \snippet tutorials/addressbook/part2/addressbook.cpp vertical layout 338 317 339 La methode \l{QBoxLayout::addStretch()}{addStretch()} est utilis ée pour340 assurer que les boutons ne sont pas r épartis uniformément, mais regroupés341 dans la partie supperieure du widget. La figure ci-dessous montre la diff érence342 si \l{QBoxLayout::addStretch()}{addStretch()} est utilis éou pas.318 La methode \l{QBoxLayout::addStretch()}{addStretch()} est utilisée pour 319 assurer que les boutons ne sont pas répartis uniformément, mais regroupés 320 dans la partie supperieure du widget. La figure ci-dessous montre la différence 321 si \l{QBoxLayout::addStretch()}{addStretch()} est utilisé ou pas. 343 322 344 323 \image addressbook-tutorial-part2-stretch-effects.png 345 324 346 Ensuite nous ajoutons \c buttonLayout1 à\c mainLayout, en utilisant325 Ensuite nous ajoutons \c buttonLayout1 à \c mainLayout, en utilisant 347 326 \l{QGridLayout::addLayout()}{addLayout()}. Ceci nous permet d'imbriquer les 348 327 mises en page puisque \c buttonLayout1 est maintenant un enfant de \c mainLayout. … … 350 329 \snippet tutorials/addressbook/part2/addressbook.cpp grid layout 351 330 352 Les coordonn ées du layout global ressemblent maintenant à ça:331 Les coordonnées du layout global ressemblent maintenant à ça: 353 332 354 333 \image addressbook-tutorial-part2-labeled-layout.png 355 334 356 Dans la m éthode \c addContact(), nous stockons les détails du dernier357 contact affich édans \c oldName et \c oldAddress. Ensuite, nous358 vidons ces champs de saisie et nous d ésactivons le mode359 lecture seule. Le focus est plac ésur \c nameLine et on affiche335 Dans la méthode \c addContact(), nous stockons les détails du dernier 336 contact affiché dans \c oldName et \c oldAddress. Ensuite, nous 337 vidons ces champs de saisie et nous désactivons le mode 338 lecture seule. Le focus est placé sur \c nameLine et on affiche 360 339 \c submitButton et \c cancelButton. 361 340 362 341 \snippet tutorials/addressbook/part2/addressbook.cpp addContact 363 342 364 La m éthode \c submitContact() peut être divisée en trois parties:343 La méthode \c submitContact() peut être divisée en trois parties: 365 344 366 345 \list 1 367 \o Nous extrayons les d étails du contact depuis \c nameLine et \c addressText346 \o Nous extrayons les détails du contact depuis \c nameLine et \c addressText 368 347 et les stockons dans des objets QString. Nous les validons pour s'assurer 369 que l'utilisateur n'a pas cliqu ésur "Add" avec des champs de saisie370 vides; sinon un message est affich é avec QMessageBox pour rappeller à371 l'utilisateur que les deux champs doivent être complétés.348 que l'utilisateur n'a pas cliqué sur "Add" avec des champs de saisie 349 vides; sinon un message est affiché avec QMessageBox pour rappeller à 350 l'utilisateur que les deux champs doivent être complétés. 372 351 373 352 \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part1 374 353 375 \o Ensuite, nous v érifions si le contact existe déjà. Si aucun contacts376 existant n'entre en conflit avec le nouveau, nous l'ajoutons à354 \o Ensuite, nous vérifions si le contact existe déjà . Si aucun contacts 355 existant n'entre en conflit avec le nouveau, nous l'ajoutons à 377 356 \c contacts et nous affichons un QMessageBox pour informer l'utilisateur 378 que le contact a été ajouté.357 que le contact a été ajouté. 379 358 380 359 \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part2 381 360 382 Si le contact existe d éjà, nous affichons un QMessageBox pour informer383 l'utilisateur du probl ème.384 Notre objet \c contacts est bas é sur des paires clé-valeur formés par385 le nom et l'adresse, nous voulons nous assurer que la \e cl éest unique.386 387 \o Une fois que les deux v érifications précédentes ont été traitées,388 nous restaurons les boutons à leur état normal àl'aide du code361 Si le contact existe déjà , nous affichons un QMessageBox pour informer 362 l'utilisateur du problÚme. 363 Notre objet \c contacts est basé sur des paires clé-valeur formés par 364 le nom et l'adresse, nous voulons nous assurer que la \e clé est unique. 365 366 \o Une fois que les deux vérifications précédentes ont été traitées, 367 nous restaurons les boutons à leur état normal à l'aide du code 389 368 suivant: 390 369 … … 393 372 \endlist 394 373 395 La capture d' écran ci-dessous montre l'affichage fournit par un objet396 QMessageBox, utilis éici pour afficher un message d'information397 àl'utilisateur:374 La capture d'écran ci-dessous montre l'affichage fournit par un objet 375 QMessageBox, utilisé ici pour afficher un message d'information 376 à l'utilisateur: 398 377 399 378 \image addressbook-tutorial-part2-add-successful.png 400 379 401 La m éthode \c cancel() restaure les détails du dernier contact, active380 La méthode \c cancel() restaure les détails du dernier contact, active 402 381 \c addButton, et cache \c submitButton et \c cancelButton. 403 382 404 383 \snippet tutorials/addressbook/part2/addressbook.cpp cancel 405 384 406 L'id ée générale pour augmenter la flexibilitélors de l'ajout d'un407 contact est de donner la possiblit éde cliquer sur "Add"408 ou "Cancel" àn'importe quel moment.409 L'organigramme ci-dessous reprend l'ensemble des interactions d évelopées385 L'idée générale pour augmenter la flexibilité lors de l'ajout d'un 386 contact est de donner la possiblité de cliquer sur "Add" 387 ou "Cancel" à n'importe quel moment. 388 L'organigramme ci-dessous reprend l'ensemble des interactions dévelopées 410 389 jusqu'ici: 411 390 … … 415 394 /*! 416 395 \page tutorials-addressbook-fr-part3.html 417 \previouspage {tutorials/addressbook-fr/part2}{Chapitre 2} 418 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 419 \nextpage {tutorials/addressbook-fr/part4}{Chapitre 4} 396 420 397 \example tutorials/addressbook-fr/part3 421 \title Carnet d'adresses 3 - Navigation entre les éléments422 423 L'application "Carnet d'adresses" est maintenant à moitié terminée. Il398 \title Carnet d'adresses 3 - Navigation entre les éléments 399 400 L'application "Carnet d'adresses" est maintenant à moitié terminée. Il 424 401 nous faut maintenant ajouter quelques fonctions pour naviguer entre 425 les contacts. Avant de commencer, il faut se d écider sur le type de structure de426 donn ées le plus appropriépour stocker les contacts.427 428 Dans le chapitre 2, nous avons utilis é un QMap utilisant des paires clé-valeur,429 avec le nom du contact comme \e cl é, et l'adresse du contact comme \e valeur.402 les contacts. Avant de commencer, il faut se décider sur le type de structure de 403 données le plus approprié pour stocker les contacts. 404 405 Dans le chapitre 2, nous avons utilisé un QMap utilisant des paires clé-valeur, 406 avec le nom du contact comme \e clé, et l'adresse du contact comme \e valeur. 430 407 Cela fonctionnait bien jusqu'ici, mais pour ajouter la navigation entre les 431 entr ées, quelques améliorations sont nécessaires.432 433 Nous am éliorerons le QMap en le faisant ressembler à une structure de données434 similaire à une liste liée, où tous les éléments sont connectés, y compris435 le premier et le dernier élément. La figure ci-dessous illustre cette structure436 de donn ée.408 entrées, quelques améliorations sont nécessaires. 409 410 Nous améliorerons le QMap en le faisant ressembler à une structure de données 411 similaire à une liste liée, où tous les éléments sont connectés, y compris 412 le premier et le dernier élément. La figure ci-dessous illustre cette structure 413 de donnée. 437 414 438 415 \image addressbook-tutorial-part3-linkedlist.png 439 416 440 \section1 D éfinition de la classe AddressBook417 \section1 Définition de la classe AddressBook 441 418 442 419 Pour ajouter les fonctions de navigation au carnet d'adresses, nous avons 443 besoin de deux slots suppl émentaires dans notre classe \c AddressBook:444 \c next() et \c previous(). Ceux-ci sont ajout és au fichier addressbook.h:420 besoin de deux slots supplémentaires dans notre classe \c AddressBook: 421 \c next() et \c previous(). Ceux-ci sont ajoutés au fichier addressbook.h: 445 422 446 423 \snippet tutorials/addressbook/part3/addressbook.h navigation functions 447 424 448 425 Nous avons aussi besoin de deux nouveaux objets QPushButton, nous ajoutons 449 donc les variables priv ées \c nextButton et \c previousButton.426 donc les variables privées \c nextButton et \c previousButton. 450 427 451 428 \snippet tutorials/addressbook/part3/addressbook.h navigation pushbuttons 452 429 453 \section1 Impl émentation de la classe AddressBook454 455 A l'int érieur du constructeur de \c AddressBook, dans \c addressbook.cpp, nous456 instancions \c nextButton et \c previousButton et nous les d ésactivons457 par d éfaut. Nous faisons ceci car la navigation ne doit être activée430 \section1 Implémentation de la classe AddressBook 431 432 A l'intérieur du constructeur de \c AddressBook, dans \c addressbook.cpp, nous 433 instancions \c nextButton et \c previousButton et nous les désactivons 434 par défaut. Nous faisons ceci car la navigation ne doit être activée 458 435 que lorsqu'il y a plus d'un contact dans le carnet d'adresses. 459 436 460 437 \snippet tutorials/addressbook/part3/addressbook.cpp navigation pushbuttons 461 438 462 Nous connectons alors ces boutons àleur slots respectifs:439 Nous connectons alors ces boutons à leur slots respectifs: 463 440 464 441 \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals 465 442 466 L'image ci-dessous montre l'interface utilisateur que nous allons cr éer.467 Remarquez que cela ressemble de plus en plus àl'interface du programme443 L'image ci-dessous montre l'interface utilisateur que nous allons créer. 444 Remarquez que cela ressemble de plus en plus à l'interface du programme 468 445 complet. 469 446 … … 471 448 472 449 Nous suivons les conventions pour les fonctions \c next() et \c previous() 473 en pla çant \c nextButton à droite et \c previousButton àgauche. Pour450 en plaçant \c nextButton à droite et \c previousButton à gauche. Pour 474 451 faire cette mise en page intuitive, nous utilisons un QHBoxLayout pour 475 placer les widgets c ôte à côte:452 placer les widgets cÃŽte à cÃŽte: 476 453 477 454 \snippet tutorials/addressbook/part3/addressbook.cpp navigation layout 478 455 479 L'objet QHBoxLayout, \c buttonLayout2, est ensuite ajout é à\c mainLayout.456 L'objet QHBoxLayout, \c buttonLayout2, est ensuite ajouté à \c mainLayout. 480 457 481 458 \snippet tutorials/addressbook/part3/addressbook.cpp adding navigation layout 482 459 483 La figure ci-dessous montre les syst èmes de coordonnées pour les widgets du460 La figure ci-dessous montre les systÚmes de coordonnées pour les widgets du 484 461 \c mainLayout. 485 462 \image addressbook-tutorial-part3-labeled-layout.png 486 463 487 Dans notre m éthode \c addContact(), nous avons desactivéces boutons488 pour être sûr que l'utilisateur n'utilise pas la navigation lors de464 Dans notre méthode \c addContact(), nous avons desactivé ces boutons 465 pour être sûr que l'utilisateur n'utilise pas la navigation lors de 489 466 l'ajout d'un contact. 490 467 491 468 \snippet tutorials/addressbook/part3/addressbook.cpp disabling navigation 492 469 493 Dans notre m éthode \c submitContact(), nous activons les boutons de470 Dans notre méthode \c submitContact(), nous activons les boutons de 494 471 navigation, \c nextButton et \c previousButton, en fonction de la 495 taille de \c contacts. Commen mentionn é plus tôt, la navigation n'est496 activ ée que si il y a plus d'un contact dans le carnet d'adresses.472 taille de \c contacts. Commen mentionné plus tÃŽt, la navigation n'est 473 activée que si il y a plus d'un contact dans le carnet d'adresses. 497 474 Les lignes suivantes montrent comment faire cela: 498 475 … … 501 478 Nous incluons aussi ces lignes de code dans le bouton \c cancel(). 502 479 503 Souvenez vous que nous voulons émuler une liste-liée ciruculaire à504 l'aide de l'objet QMap, \c contacts. Pour faire cela, nous obtenons un it érateur505 sur \c contact dans la m éthode \c next(), et ensuite:480 Souvenez vous que nous voulons émuler une liste-liée ciruculaire à 481 l'aide de l'objet QMap, \c contacts. Pour faire cela, nous obtenons un itérateur 482 sur \c contact dans la méthode \c next(), et ensuite: 506 483 507 484 \list 508 \o Si l'it érateur n'est pas à la fin de \c contacts, nous l'incrémentons509 \o Si l'it érateur est àla fin de \c contacts, nous changeons sa position510 jusqu'au d ébut de \c contacts. Cela donne l'illusion que notre QMap485 \o Si l'itérateur n'est pas à la fin de \c contacts, nous l'incrémentons 486 \o Si l'itérateur est à la fin de \c contacts, nous changeons sa position 487 jusqu'au début de \c contacts. Cela donne l'illusion que notre QMap 511 488 fonctionne comme une liste circulaire. 512 489 \endlist … … 514 491 \snippet tutorials/addressbook/part3/addressbook.cpp next() function 515 492 516 Une fois que nous avons it éré jusqu'à l'objet recherchédans \c contacts,493 Une fois que nous avons itéré jusqu'à l'objet recherché dans \c contacts, 517 494 nous affichons son contenu sur \c nameLine et \c addressText. 518 495 519 De la m ême façon, pour la méthode \c previous(), nous obtenons un520 it érateur sur \c contacts et ensuite:496 De la même façon, pour la méthode \c previous(), nous obtenons un 497 itérateur sur \c contacts et ensuite: 521 498 522 499 \list 523 \o Si l'it érateur est à la fin de \c contacts, on réinitialise500 \o Si l'itérateur est à la fin de \c contacts, on réinitialise 524 501 l'affichage et on retourne. 525 \o Si l'it érateur est au début de \c contacts, on change sa526 position jusqu' àla fin527 \o Ensuite, on d écrémente l'itérateur502 \o Si l'itérateur est au début de \c contacts, on change sa 503 position jusqu'à la fin 504 \o Ensuite, on décrémente l'itérateur 528 505 \endlist 529 506 530 507 \snippet tutorials/addressbook/part3/addressbook.cpp previous() function 531 508 532 ànouveau, nous affichons le contenu de l'objet courant dans \c contacts.509 à nouveau, nous affichons le contenu de l'objet courant dans \c contacts. 533 510 534 511 */ … … 537 514 538 515 \page tutorials-addressbook-fr-part4.html 539 \previouspage {tutorials/addressbook-fr/part3}{Chapitre 3} 540 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 541 \nextpage {tutorials/addressbook-fr/part5}{Chapitre 5} 516 542 517 \example tutorials/addressbook-fr/part4 543 \title Carnet d'Adresses 4 - éditer et supprimer des adresses544 545 546 Dans ce chapitre, nous verrons comment modifier les donn ées des contacts518 \title Carnet d'Adresses 4 - éditer et supprimer des adresses 519 520 521 Dans ce chapitre, nous verrons comment modifier les données des contacts 547 522 contenus dans l'application carnet d'adresses. 548 523 … … 551 526 552 527 Nous avons maintenant un carnet d'adresses qui ne se contente pas de 553 lister des contacts de fa çon ordonnée, mais permet également la554 navigation. Il serait pratique d'inclure des fonctions telles qu' éditer et555 supprimer, afin que les d étails associés à un contact puissent être556 modifi és lorsque c'est nécessaire. Cependant, cela requiert une légère557 modification, sous la forme d' énumérations. Au chapitre précédent, nous avions deux558 modes: \c {AddingMode} et \c {NavigationMode}, mais ils n' étaient pas559 d éfinis en tant qu'énumérations. Au lieu de ça, on activait et désactivait les528 lister des contacts de façon ordonnée, mais permet également la 529 navigation. Il serait pratique d'inclure des fonctions telles qu'éditer et 530 supprimer, afin que les détails associés à un contact puissent être 531 modifiés lorsque c'est nécessaire. Cependant, cela requiert une légÚre 532 modification, sous la forme d'énumérations. Au chapitre précédent, nous avions deux 533 modes: \c {AddingMode} et \c {NavigationMode}, mais ils n'étaient pas 534 définis en tant qu'énumérations. Au lieu de ça, on activait et désactivait les 560 535 boutons correspondants manuellement, au prix de multiples redondances dans 561 536 le code. 562 537 563 Dans ce chapitre, on d éfinit l'énumération \c Mode avec trois valeurs possibles.538 Dans ce chapitre, on définit l'énumération \c Mode avec trois valeurs possibles. 564 539 565 540 \list … … 569 544 \endlist 570 545 571 \section1 D éfinition de la classe AddressBook572 573 Le fichier \c addressbook.h est mis a jour pour contenir l' énumération \c Mode :546 \section1 Définition de la classe AddressBook 547 548 Le fichier \c addressbook.h est mis a jour pour contenir l'énumération \c Mode : 574 549 575 550 \snippet tutorials/addressbook/part4/addressbook.h Mode enum 576 551 577 On ajoute également deux nouveaux slots, \c editContact() et578 \c removeContact(), ànotre liste de slots publics.552 On ajoute également deux nouveaux slots, \c editContact() et 553 \c removeContact(), à notre liste de slots publics. 579 554 580 555 \snippet tutorials/addressbook/part4/addressbook.h edit and remove slots 581 556 582 Afin de basculer d'un mode à l'autre, on introduit la méthode583 \c updateInterface() pour contr ôller l'activation et la désactivation de584 tous les objets QPushButton. On ajoute également deux nouveaux boutons,585 \c editButton et \c removeButton, pour les fonctions d' édition586 et de suppression mentionn ées plus haut.557 Afin de basculer d'un mode à l'autre, on introduit la méthode 558 \c updateInterface() pour contrÃŽller l'activation et la désactivation de 559 tous les objets QPushButton. On ajoute également deux nouveaux boutons, 560 \c editButton et \c removeButton, pour les fonctions d'édition 561 et de suppression mentionnées plus haut. 587 562 588 563 \snippet tutorials/addressbook/part4/addressbook.h updateInterface() declaration … … 592 567 \snippet tutorials/addressbook/part4/addressbook.h mode declaration 593 568 594 Enfin, on d éclare \c currentMode pour garder une trace du mode595 actuellement utilis é.596 597 \section1 Impl émentation de la classe AddressBook598 599 Il nous faut maintenant impl émenter les fonctionnalités de changement de569 Enfin, on déclare \c currentMode pour garder une trace du mode 570 actuellement utilisé. 571 572 \section1 Implémentation de la classe AddressBook 573 574 Il nous faut maintenant implémenter les fonctionnalités de changement de 600 575 mode de l'application carnet d'adresses. Les boutons \c editButton et 601 \c removeButton sont instanci és et désactivés par défaut, puisque le602 carnet d'adresses d émarre sans aucun contact en mémoire.576 \c removeButton sont instanciés et désactivés par défaut, puisque le 577 carnet d'adresses démarre sans aucun contact en mémoire. 603 578 604 579 \snippet tutorials/addressbook/part4/addressbook.cpp edit and remove buttons 605 580 606 Ces boutons sont ensuite connect és àleurs slots respectifs,607 \c editContact() et \c removeContact(), avant d' être ajoutés à581 Ces boutons sont ensuite connectés à leurs slots respectifs, 582 \c editContact() et \c removeContact(), avant d'être ajoutés à 608 583 \c buttonLayout1. 609 584 … … 612 587 \snippet tutorials/addressbook/part4/addressbook.cpp adding edit and remove to the layout 613 588 614 La methode \c editContact() place les anciens d étails du contact dans589 La methode \c editContact() place les anciens détails du contact dans 615 590 \c oldName et \c oldAddress, avant de basculer vers le mode 616 591 \c EditingMode. Dans ce mode, les boutons \c submitButton et 617 \c cancelButton sont tous deux activ és, l'utilisateur peut par conséquent618 modifier les d étails du contact et cliquer sur l'un de ces deux boutons592 \c cancelButton sont tous deux activés, l'utilisateur peut par conséquent 593 modifier les détails du contact et cliquer sur l'un de ces deux boutons 619 594 par la suite. 620 595 621 596 \snippet tutorials/addressbook/part4/addressbook.cpp editContact() function 622 597 623 La m éthode \c submitContact() a été divisée en deux avec un bloc598 La méthode \c submitContact() a été divisée en deux avec un bloc 624 599 \c{if-else}. On teste \c currentMode pour voir si le mode courant est 625 \c AddingMode. Si c'est le cas, on proc ède àl'ajout.600 \c AddingMode. Si c'est le cas, on procÚde à l'ajout. 626 601 627 602 \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function beginning … … 630 605 631 606 Sinon, on s'assure que \c currentMode est en \c EditingMode. Si c'est le 632 cas, on compare \c oldName et \c name. Si le nom a chang é, on supprime633 l'ancien contact de \c contacts et on ins ère le contact mis a jour.607 cas, on compare \c oldName et \c name. Si le nom a changé, on supprime 608 l'ancien contact de \c contacts et on insÚre le contact mis a jour. 634 609 635 610 \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part2 636 611 637 Si seule l'adresse a chang é (i.e. \c oldAddress n'est pas identique à638 \c address), on met à jour l'adresse du contact. Enfin on règle639 \c currentMode à \c NavigationMode. C'est une étape importante puisque640 c'est cela qui r éactive tous les boutons désactivés.641 642 Afin de retirer un contact du carnet d'adresses, on impl émente la méthode643 \c removeContact(). Cette m éthode vérifie que le contact est présent dans612 Si seule l'adresse a changé (i.e. \c oldAddress n'est pas identique à 613 \c address), on met à jour l'adresse du contact. Enfin on rÚgle 614 \c currentMode à \c NavigationMode. C'est une étape importante puisque 615 c'est cela qui réactive tous les boutons désactivés. 616 617 Afin de retirer un contact du carnet d'adresses, on implémente la méthode 618 \c removeContact(). Cette méthode vérifie que le contact est présent dans 644 619 \c contacts. 645 620 646 621 \snippet tutorials/addressbook/part4/addressbook.cpp removeContact() function 647 622 648 Si c'est le cas, on affiche une bo îte de dialogue QMessageBox, demandant649 confirmation de la suppression àl'utilisateur. Une fois la confirmation650 effectu ée, on appelle \c previous(), afin de s'assurer que l'interface651 utilisateur affiche une autre entr ée, et on supprime le contact en652 utilisant le m éthode \l{QMap::remove()}{remove()} de \l{QMap}. Dans un623 Si c'est le cas, on affiche une boîte de dialogue QMessageBox, demandant 624 confirmation de la suppression à l'utilisateur. Une fois la confirmation 625 effectuée, on appelle \c previous(), afin de s'assurer que l'interface 626 utilisateur affiche une autre entrée, et on supprime le contact en 627 utilisant le méthode \l{QMap::remove()}{remove()} de \l{QMap}. Dans un 653 628 souci pratique, on informe l'utilisateur de la suppression par le biais 654 d'une autre QMessageBox. Les deux bo îtes de dialogue utilisées dans cette655 m éthode sont représentées ci-dessous.629 d'une autre QMessageBox. Les deux boîtes de dialogue utilisées dans cette 630 méthode sont représentées ci-dessous. 656 631 657 632 \image addressbook-tutorial-part4-remove.png 658 633 659 \section2 Mise àjour de l'Interface utilisateur660 661 On a évoqué plus haut la méthode \c updateInterface() comme moyen662 d'activer et de d ésactiver les différents boutons de l'interface en663 fonction du mode. Cette m éthode met àjour le mode courant selon664 l'argument \c mode qui lui est pass é, en l'assignant à\c currentMode,634 \section2 Mise à jour de l'Interface utilisateur 635 636 On a évoqué plus haut la méthode \c updateInterface() comme moyen 637 d'activer et de désactiver les différents boutons de l'interface en 638 fonction du mode. Cette méthode met à jour le mode courant selon 639 l'argument \c mode qui lui est passé, en l'assignant à \c currentMode, 665 640 avant de tester sa valeur. 666 641 667 Chacun des boutons est ensuite activ é ou désactivé, en fonction du mode.642 Chacun des boutons est ensuite activé ou désactivé, en fonction du mode. 668 643 Le code source pour les cas \c AddingMode et \c EditingMode est visible 669 644 ci-dessous: … … 672 647 673 648 Dans le cas de \c NavigationMode, en revanche, des tests conditionnels 674 sont pass és en paramètre de QPushButton::setEnabled(). Ceci permet de675 s'assurer que les boutons \c editButton et \c removeButton ne sont activ és649 sont passés en paramÚtre de QPushButton::setEnabled(). Ceci permet de 650 s'assurer que les boutons \c editButton et \c removeButton ne sont activés 676 651 que s'il existe au moins un contact dans le carnet d'adresses; 677 \c nextButton et \c previousButton ne sont activ és que lorsqu'il existe652 \c nextButton et \c previousButton ne sont activés que lorsqu'il existe 678 653 plus d'un contact dans le carnet d'adresses. 679 654 680 655 \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 2 681 656 682 En effectuant les op érations de réglage du mode et de mise àjour de683 l'interface utilisateur au sein de la m ême méthode, on est àl'abri de684 l' éventualité où l'interface utilisateur se "désynchronise" de l'état657 En effectuant les opérations de réglage du mode et de mise à jour de 658 l'interface utilisateur au sein de la même méthode, on est à l'abri de 659 l'éventualité où l'interface utilisateur se "désynchronise" de l'état 685 660 interne de l'application. 686 661 … … 689 664 /*! 690 665 \page tutorials-addressbook-fr-part5.html 691 \previouspage {tutorials/addressbook-fr/part4}{Chapitre 4} 692 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 693 \nextpage {tutorials/addressbook-fr/part6}{Chapitre 6} 666 694 667 \example tutorials/addressbook-fr/part5 695 668 \title Carnet d'adresse 5 - Ajout d'une fonction de recherche 696 669 697 Dans ce chapitre, nous allons voir les possibilit és pour rechercher670 Dans ce chapitre, nous allons voir les possibilités pour rechercher 698 671 des contacts dans le carnet d'adresse. 699 672 … … 704 677 Dans ce cas, une fonction de recherche serait plus efficace pour rechercher 705 678 les contacts. 706 La capture d' écran ci-dessus montre le bouton de recherche \e Find et sa position679 La capture d'écran ci-dessus montre le bouton de recherche \e Find et sa position 707 680 dans le paneau de bouton. 708 681 709 682 Lorsque l'utilisateur clique sur le bouton \e Find, il est courant d'afficher 710 une bo îte de dialogue qui demande àl'utilisateur d'entrer un nom de contact.683 une boîte de dialogue qui demande à l'utilisateur d'entrer un nom de contact. 711 684 Qt fournit la classe QDialog, que nous sous-classons dans ce chapitre pour 712 impl émenter la class \c FindDialog.713 714 \section1 D éfinition de la classe FindDialog685 implémenter la class \c FindDialog. 686 687 \section1 Définition de la classe FindDialog 715 688 716 689 \image addressbook-tutorial-part5-finddialog.png 717 690 718 Pour sous-classer QDialog, nous commen çons par inclure le header de719 QDialog dans le fichier \c finddialog.h. De plus, nous d éclarons les691 Pour sous-classer QDialog, nous commençons par inclure le header de 692 QDialog dans le fichier \c finddialog.h. De plus, nous déclarons les 720 693 classes QLineEdit et QPushButton car nous utilisons ces widgets dans 721 694 notre classe dialogue. 722 695 723 696 Tout comme dans la classe \c AddressBook, la classe \c FindDialog utilise 724 la macro Q_OBJECT et son constructeur est d éfini de façon àaccepter725 un QWidget parent, m ême si cette boîte de dialogue sera affichée dans une726 fen être séparée.697 la macro Q_OBJECT et son constructeur est défini de façon à accepter 698 un QWidget parent, même si cette boîte de dialogue sera affichée dans une 699 fenêtre séparée. 727 700 728 701 \snippet tutorials/addressbook/part5/finddialog.h FindDialog header 729 702 730 Nous d éfinissons la méthode publique \c getFindText() pour être utilisée703 Nous définissons la méthode publique \c getFindText() pour être utilisée 731 704 par les classes qui instancient \c FindDialog, ce qui leur permet d'obtenir 732 le texte entr épar l'utilisateur. Un slot public, \c findClicked(), est733 d éfini pour prendre en charge le texte lorsque l'utilisateur clique sur705 le texte entré par l'utilisateur. Un slot public, \c findClicked(), est 706 défini pour prendre en charge le texte lorsque l'utilisateur clique sur 734 707 le bouton \gui Find. 735 708 736 Finalement, nous d éfinissons les variables privées \c findButton,709 Finalement, nous définissons les variables privées \c findButton, 737 710 \c lineEdit et \c findText, qui correspondent respectivement au bouton 738 711 \gui Find, au champ de texte dans lequel l'utilisateur tape le texte 739 à rechercher, et àune variable interne stockant le texte pour une740 utilisation ult érieure.741 742 \section1 Impl émentation de la classe FindDialog712 à rechercher, et à une variable interne stockant le texte pour une 713 utilisation ultérieure. 714 715 \section1 Implémentation de la classe FindDialog 743 716 744 717 Dans le constructeur de \c FindDialog, nous instancions les objets des 745 variables priv ées \c lineEdit, \c findButton et \c findText. Nous utilisons ensuite718 variables privées \c lineEdit, \c findButton et \c findText. Nous utilisons ensuite 746 719 un QHBoxLayout pour positionner les widgets. 747 720 748 721 \snippet tutorials/addressbook/part5/finddialog.cpp constructor 749 722 750 Nous mettons en place la mise en page et le titre de la fen être, et723 Nous mettons en place la mise en page et le titre de la fenêtre, et 751 724 nous connectons les signaux aux slots. Remarquez que le signal 752 \l{QPushButton::clicked()}{clicked()} de \c{findButton} est connect é753 à\c findClicked() et \l{QDialog::accept()}{accept()}. Le slot725 \l{QPushButton::clicked()}{clicked()} de \c{findButton} est connecté 726 à \c findClicked() et \l{QDialog::accept()}{accept()}. Le slot 754 727 \l{QDialog::accept()}{accept()} fourni par le QDialog ferme 755 la bo îte de dialogue et lui donne le code de retour \l{QDialog::}{Accepted}.756 Nous utilisons cette fonction pour aider la m éthode \c findContact() de la classe757 \c{AddressBook} à savoir si l'objet \c FindDialog a été fermé. Ceci sera758 expliqu é plus loin lorsque nous verrons la méthode \c findContact().728 la boîte de dialogue et lui donne le code de retour \l{QDialog::}{Accepted}. 729 Nous utilisons cette fonction pour aider la méthode \c findContact() de la classe 730 \c{AddressBook} à savoir si l'objet \c FindDialog a été fermé. Ceci sera 731 expliqué plus loin lorsque nous verrons la méthode \c findContact(). 759 732 760 733 \image addressbook-tutorial-part5-signals-and-slots.png 761 734 762 735 Dans \c findClicked(), nous validons le champ de texte pour nous 763 assurer que l'utilisateur n'a pas cliqu ésur le bouton \gui Find sans764 avoir entr éun nom de contact. Ensuite, nous stockons le texte du champ765 d'entr ée \c lineEdit dans \c findText. Et finalement nous vidons le766 contenu de \c lineEdit et cachons la bo îte de dialogue.736 assurer que l'utilisateur n'a pas cliqué sur le bouton \gui Find sans 737 avoir entré un nom de contact. Ensuite, nous stockons le texte du champ 738 d'entrée \c lineEdit dans \c findText. Et finalement nous vidons le 739 contenu de \c lineEdit et cachons la boîte de dialogue. 767 740 768 741 \snippet tutorials/addressbook/part5/finddialog.cpp findClicked() function 769 742 770 La variable \c findText a un accesseur publique associ é: \c getFindText().771 Étant donnéque nous ne modifions \c findText directement que dans le772 constructeur et la m éthode \c findClicked(), nous ne créons pas773 de manipulateurs associ é à\c getFindText().743 La variable \c findText a un accesseur publique associé: \c getFindText(). 744 Ãtant donné que nous ne modifions \c findText directement que dans le 745 constructeur et la méthode \c findClicked(), nous ne créons pas 746 de manipulateurs associé à \c getFindText(). 774 747 Puisque \c getFindText() est publique, les classes instanciant et 775 utilisant \c FindDialog peuvent toujours acc éder à la chaîne de776 caract ères que l'utilisateur a entré et accepté.748 utilisant \c FindDialog peuvent toujours accéder à la chaîne de 749 caractÚres que l'utilisateur a entré et accepté. 777 750 778 751 \snippet tutorials/addressbook/part5/finddialog.cpp getFindText() function 779 752 780 \section1 D éfinition de la classe AddressBook753 \section1 Définition de la classe AddressBook 781 754 782 755 Pour utiliser \c FindDialog depuis la classe \c AddressBook, nous … … 785 758 \snippet tutorials/addressbook/part5/addressbook.h include finddialog's header 786 759 787 Jusqu'ici, toutes les fonctionnalit és du carnet d'adresses ont un788 QPushButton et un slot correspondant. De la m ême façon, pour la789 fonctionnalit é\gui Find, nous avons \c findButton et \c findContact().790 791 Le \c findButton est d éclaré comme une variable privée et la792 m éthode \c findContact() est déclarée comme un slot public.760 Jusqu'ici, toutes les fonctionnalités du carnet d'adresses ont un 761 QPushButton et un slot correspondant. De la même façon, pour la 762 fonctionnalité \gui Find, nous avons \c findButton et \c findContact(). 763 764 Le \c findButton est déclaré comme une variable privée et la 765 méthode \c findContact() est déclarée comme un slot public. 793 766 794 767 \snippet tutorials/addressbook/part5/addressbook.h findContact() declaration … … 796 769 \snippet tutorials/addressbook/part5/addressbook.h findButton declaration 797 770 798 Finalement, nous d éclarons la variable privée \c dialog que nous allons799 utiliser pour acc éder àune instance de \c FindDialog.771 Finalement, nous déclarons la variable privée \c dialog que nous allons 772 utiliser pour accéder à une instance de \c FindDialog. 800 773 801 774 \snippet tutorials/addressbook/part5/addressbook.h FindDialog declaration 802 775 803 Une fois que nous avons instanci é la boîte de dialogue, nous voulons l'utiliser804 plus qu'une fois. Utiliser une variable priv ée nous permet d'y référer805 àplus d'un endroit dans la classe.806 807 \section1 Impl émentation de la classe AddressBook808 809 Dans le constructeur de \c AddressBook, nous instancions nos objets priv és,776 Une fois que nous avons instancié la boîte de dialogue, nous voulons l'utiliser 777 plus qu'une fois. Utiliser une variable privée nous permet d'y référer 778 à plus d'un endroit dans la classe. 779 780 \section1 Implémentation de la classe AddressBook 781 782 Dans le constructeur de \c AddressBook, nous instancions nos objets privés, 810 783 \c findbutton et \c findDialog: 811 784 … … 815 788 816 789 Ensuite, nous connectons le signal \l{QPushButton::clicked()}{clicked()} de 817 \c{findButton} à\c findContact().790 \c{findButton} à \c findContact(). 818 791 819 792 \snippet tutorials/addressbook/part5/addressbook.cpp signals and slots for find 820 793 821 Maintenant, tout ce qui manque est le code de notre m éthode \c findContact():794 Maintenant, tout ce qui manque est le code de notre méthode \c findContact(): 822 795 823 796 \snippet tutorials/addressbook/part5/addressbook.cpp findContact() function 824 797 825 Nous commen çons par afficher l'instance de \c FindDialog, \c dialog.826 L'utilisateur peut alors entrer le nom du contact àrechercher. Lorsque827 l'utilisateur clique sur le bouton \c findButton, la bo îte de dialogue est828 masqu ée et le code de retour devient QDialog::Accepted. Ce code de retour798 Nous commençons par afficher l'instance de \c FindDialog, \c dialog. 799 L'utilisateur peut alors entrer le nom du contact à rechercher. Lorsque 800 l'utilisateur clique sur le bouton \c findButton, la boîte de dialogue est 801 masquée et le code de retour devient QDialog::Accepted. Ce code de retour 829 802 vient remplir la condition du premier if. 830 803 831 804 Ensuite, nous extrayons le texte que nous utiliserons pour la recherche, 832 il s'agit ici de \c contactName obtenu à l'aide de la méthode \c getFindText()805 il s'agit ici de \c contactName obtenu à l'aide de la méthode \c getFindText() 833 806 de \c FindDialog. Si le contact existe dans le carnet d'adresse, nous 834 807 l'affichons directement. Sinon, nous affichons le QMessageBox suivant pour 835 indiquer que la recherche à échouée.808 indiquer que la recherche à échouée. 836 809 837 810 \image addressbook-tutorial-part5-notfound.png … … 840 813 /*! 841 814 \page tutorials-addressbook-part6.html 842 \previouspage {tutorials/addressbook-fr/part5}{Chapitre 5} 843 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 844 \nextpage {tutorials/addressbook-fr/part7}{Chapitre 7} 815 845 816 \example tutorials/addressbook-fr/part6 846 817 \title Carnet d'Adresses 6 - Sauvegarde et chargement 847 818 848 Ce chapitre couvre les fonctionnalit és de gestion des fichiers de Qt que849 l'on utilise pour écrire les procédures de sauvegarde et chargement pour819 Ce chapitre couvre les fonctionnalités de gestion des fichiers de Qt que 820 l'on utilise pour écrire les procédures de sauvegarde et chargement pour 850 821 l'application carnet d'adresses. 851 822 … … 853 824 854 825 Bien que la navigation et la recherche de contacts soient des 855 fonctionnalit és importantes, notre carnet d'adresses ne sera pleinement826 fonctionnalités importantes, notre carnet d'adresses ne sera pleinement 856 827 utilisable qu'une fois que l'on pourra sauvegarder les contacts existants 857 et les charger ànouveau par la suite.858 Qt fournit de nombreuses classes pour g érer les \l{Input/Output and859 Networking}{entr ées et sorties}, mais nous avons choisi de nous contenter d'une860 combinaison de deux classes simples àutiliser ensemble: QFile et QDataStream.861 862 Un objet QFile repr ésente un fichier sur le disque qui peut être lu, et863 dans lequel on peut écrire. QFile est une classe fille de la classe plus864 g énérique QIODevice, qui peut représenter différents types de865 p ériphériques.866 867 Un objet QDataStream est utilis é pour sérialiser des données binaires868 dans le but de les passer à un QIODevice pour les récupérer dans le869 futur. Pour lire ou écrire dans un QIODevice, il suffit d'ouvrir le870 flux, avec le p ériphérique approprié en paramètre, et d'y lire ou871 écrire.872 873 \section1 D éfinition de la classe AddressBook874 875 On d éclare deux slots publics, \c saveToFile() et \c loadFromFile(),828 et les charger à nouveau par la suite. 829 Qt fournit de nombreuses classes pour gérer les \l{Input/Output and 830 Networking}{entrées et sorties}, mais nous avons choisi de nous contenter d'une 831 combinaison de deux classes simples à utiliser ensemble: QFile et QDataStream. 832 833 Un objet QFile représente un fichier sur le disque qui peut être lu, et 834 dans lequel on peut écrire. QFile est une classe fille de la classe plus 835 générique QIODevice, qui peut représenter différents types de 836 périphériques. 837 838 Un objet QDataStream est utilisé pour sérialiser des données binaires 839 dans le but de les passer à un QIODevice pour les récupérer dans le 840 futur. Pour lire ou écrire dans un QIODevice, il suffit d'ouvrir le 841 flux, avec le périphérique approprié en paramÚtre, et d'y lire ou 842 écrire. 843 844 \section1 Définition de la classe AddressBook 845 846 On déclare deux slots publics, \c saveToFile() et \c loadFromFile(), 876 847 ainsi que deux objets QPushButton, \c loadButton et \c saveButton. 877 848 … … 880 851 \snippet tutorials/addressbook/part6/addressbook.h save and load buttons declaration 881 852 882 \section1 Impl émentation de la classe AddressBook853 \section1 Implémentation de la classe AddressBook 883 854 884 855 Dans notre constructeur, on instancie \c loadButton et \c saveButton. 885 Id éalement, l'interface serait plus conviviale avec des boutons856 Idéalement, l'interface serait plus conviviale avec des boutons 886 857 affichant "Load contacts from a file" et "Save contacts to a file". Mais 887 858 compte tenu de la dimension des autres boutons, on initialise les labels 888 des boutons à\gui{Load...} et \gui{Save...}. Heureusement, Qt offre une889 fa çon simple d'ajouter des info-bulles avec890 \l{QWidget::setToolTip()}{setToolTip()}, et nous l'exploitons de la fa çon859 des boutons à \gui{Load...} et \gui{Save...}. Heureusement, Qt offre une 860 façon simple d'ajouter des info-bulles avec 861 \l{QWidget::setToolTip()}{setToolTip()}, et nous l'exploitons de la façon 891 862 suivante pour nos boutons: 892 863 … … 896 867 897 868 Bien qu'on ne cite pas le code correspondant ici, nous ajoutons ces deux boutons au 898 layout de droite, \c button1Layout, comme pour les fonctionnalit és précédentes, et869 layout de droite, \c button1Layout, comme pour les fonctionnalités précédentes, et 899 870 nous connectons leurs signaux 900 \l{QPushButton::clicked()}{clicked()} àleurs slots respectifs.901 902 Pour la sauvegarde, on commence par r écupérer le nom de fichier871 \l{QPushButton::clicked()}{clicked()} à leurs slots respectifs. 872 873 Pour la sauvegarde, on commence par récupérer le nom de fichier 903 874 \c fileName, en utilisant QFileDialog::getSaveFileName(). C'est une 904 m éthode pratique fournie par QFileDialog, qui ouvre une boîte de905 dialogue modale et permet àl'utilisateur d'entrer un nom de fichier ou875 méthode pratique fournie par QFileDialog, qui ouvre une boîte de 876 dialogue modale et permet à l'utilisateur d'entrer un nom de fichier ou 906 877 de choisir un fichier \c{.abk} existant. Les fichiers \c{.abk} 907 correspondent àl'extension choisie pour la sauvegarde des contacts de878 correspondent à l'extension choisie pour la sauvegarde des contacts de 908 879 notre carnet d'adresses. 909 880 910 881 \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part1 911 882 912 La bo îte de dialogue affichée est visible sur la capture d'écran ci-883 La boîte de dialogue affichée est visible sur la capture d'écran ci- 913 884 dessous. 914 885 915 886 \image addressbook-tutorial-part6-save.png 916 887 917 Si \c fileName n'est pas vide, on cr ée un objet QFile, \c file, àpartir918 de \c fileName. QFile fonctionne avec QDataStream puisqu'il d érive de888 Si \c fileName n'est pas vide, on crée un objet QFile, \c file, à partir 889 de \c fileName. QFile fonctionne avec QDataStream puisqu'il dérive de 919 890 QIODevice. 920 891 921 Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au922 mode \l{QIODevice::}{WriteOnly}. Si cela échoue, on en informe892 Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au 893 mode \l{QIODevice::}{WriteOnly}. Si cela échoue, on en informe 923 894 l'utilisateur avec une QMessageBox. 924 895 … … 926 897 927 898 Dans le cas contraire, on instancie un objet QDataStream, \c out, afin 928 d' écrire dans le fichier ouvert. QDataStream nécessite que la même929 version de flux soit utilis ée pour la lecture et l'écriture. On s'assure930 que c'est le cas en sp écifiant explicitement d'utiliser la899 d'écrire dans le fichier ouvert. QDataStream nécessite que la même 900 version de flux soit utilisée pour la lecture et l'écriture. On s'assure 901 que c'est le cas en spécifiant explicitement d'utiliser la 931 902 \l{QDataStream::Qt_4_5}{version introduite avec Qt 4.5} avant de 932 s érialiser les données vers le fichier \c file.903 sérialiser les données vers le fichier \c file. 933 904 934 905 \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part3 935 906 936 Pour le chargement, on r écupère également \c fileName en utilisant937 QFileDialog::getOpenFileName(). Cette m éthode est l'homologue de938 QFileDialog::getSaveFileName() et affiche également une boîte de939 dialogue modale permettant àl'utilisateur d'entrer un nom de fichier ou907 Pour le chargement, on récupÚre également \c fileName en utilisant 908 QFileDialog::getOpenFileName(). Cette méthode est l'homologue de 909 QFileDialog::getSaveFileName() et affiche également une boîte de 910 dialogue modale permettant à l'utilisateur d'entrer un nom de fichier ou 940 911 de selectionner un fichier \c{.abk} existant, afin de le charger dans le 941 912 carnet d'adresses. … … 943 914 \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part1 944 915 945 Sous Windows, par exemple, cette m éthode affiche une boîte de dialogue946 native pour la s élection de fichier, comme illustrésur la capture947 d' écran suivante:916 Sous Windows, par exemple, cette méthode affiche une boîte de dialogue 917 native pour la sélection de fichier, comme illustré sur la capture 918 d'écran suivante: 948 919 949 920 \image addressbook-tutorial-part6-load.png … … 951 922 Si \c fileName n'est pas vide, on utilise une fois de plus un objet 952 923 QFile, \c file, et on tente de l'ouvrir en lecture, avec le mode 953 \l{QIODevice::}{ReadOnly}. De m ême que précédemment dans notre954 impl émentation de \c saveToFile(), si cette tentative s'avère924 \l{QIODevice::}{ReadOnly}. De même que précédemment dans notre 925 implémentation de \c saveToFile(), si cette tentative s'avÚre 955 926 infructueuse, on en informe l'utilisateur par le biais d'une 956 927 QMessageBox. … … 959 930 960 931 Dans le cas contraire, on instancie un objet QDataStream, \c in, en 961 sp écifiant la version à utiliser comme précédemment, et on lit les962 informations s érialisées vers la structure de données \c contacts. Notez932 spécifiant la version à utiliser comme précédemment, et on lit les 933 informations sérialisées vers la structure de données \c contacts. Notez 963 934 qu'on purge \c contacts avant d'y mettre les informations lues afin de 964 simplifier le processus de lecture de fichier. Une fa çon plus avancée de965 proc éder serait de lire les contacts dans un objet QMap temporaire, et935 simplifier le processus de lecture de fichier. Une façon plus avancée de 936 procéder serait de lire les contacts dans un objet QMap temporaire, et 966 937 de copier uniquement les contacts n'existant pas encore dans 967 938 \c contacts. … … 970 941 971 942 Pour afficher les contacts lus depuis le fichier, on doit d'abord 972 valider les donn ées obtenues afin de s'assurer que le fichier lu973 contient effectivement des entr ées de carnet d'adresses. Si c'est le943 valider les données obtenues afin de s'assurer que le fichier lu 944 contient effectivement des entrées de carnet d'adresses. Si c'est le 974 945 cas, on affiche le premier contact; sinon on informe l'utilisateur du 975 probl ème par une QMessageBox. Enfin, on met àjour l'interface afin976 d'activer et de d ésactiver les boutons de façon appropriée.946 problÚme par une QMessageBox. Enfin, on met à jour l'interface afin 947 d'activer et de désactiver les boutons de façon appropriée. 977 948 */ 978 949 979 950 /*! 980 951 \page tutorials-addressbook-fr-part7.html 981 \previouspage {tutorials/addressbook-fr/part6}{Chapitre 6} 982 \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire} 952 983 953 \example tutorials/addressbook-fr/part7 984 \title Carnet d'adresse 7 - Fonctionnalit és avancées985 986 Ce chapitre couvre quelques fonctionnalit és additionnelles qui954 \title Carnet d'adresse 7 - Fonctionnalités avancées 955 956 Ce chapitre couvre quelques fonctionnalités additionnelles qui 987 957 feront de notre carnet d'adresses une application plus pratique 988 958 pour une utilisation quotidienne. … … 991 961 992 962 Bien que notre application carnet d'adresses soit utile en tant que telle, 993 il serait pratique de pouvoir échanger les contacts avec d'autres applications.994 Le format vCard est un un format de fichier populaire pour échanger995 ce type de donn ées.996 Dans ce chapitre, nous étendrons notre carnet d'adresses pour permettre963 il serait pratique de pouvoir échanger les contacts avec d'autres applications. 964 Le format vCard est un un format de fichier populaire pour échanger 965 ce type de données. 966 Dans ce chapitre, nous étendrons notre carnet d'adresses pour permettre 997 967 d'exporter des contacts dans des fichiers vCard \c{.vcf}. 998 968 999 \section1 D éfinition de la classe AddressBook969 \section1 Définition de la classe AddressBook 1000 970 1001 971 Nous ajoutons un objet QPushButton, \c exportButton, et un slot 1002 public correspondant, \c exportAsVCard(), ànotre classe \c AddressBook972 public correspondant, \c exportAsVCard(), à notre classe \c AddressBook 1003 973 dans le fichier \c addressbook.h. 1004 974 … … 1007 977 \snippet tutorials/addressbook/part7/addressbook.h exportButton declaration 1008 978 1009 \section1 Impl émentation de la classe AddressBook979 \section1 Implémentation de la classe AddressBook 1010 980 1011 981 Dans le constructeur de \c AddressBook, nous connectons le signal 1012 982 \l{QPushButton::clicked()}{clicked()} de \c{exportButton} au slot 1013 983 \c exportAsVCard(). 1014 Nous ajoutons aussi ce bouton à\c buttonLayout1, le layout responsable984 Nous ajoutons aussi ce bouton à \c buttonLayout1, le layout responsable 1015 985 du groupe de boutons sur la droite. 1016 986 1017 Dans la m éthode \c exportAsVCard(), nous commençons par extraire le1018 nom du contact dans \n name. Nous d éclarons \c firstname, \c lastName et987 Dans la méthode \c exportAsVCard(), nous commençons par extraire le 988 nom du contact dans \n name. Nous déclarons \c firstname, \c lastName et 1019 989 \c nameList. 1020 990 Ensuite, nous cherchons la position du premier espace blanc de \c name. 1021 Si il y a un espace, nous s éparons le nom du contact en \c firstName et1022 \c lastName. Finalement, nous rempla çons l'espace par un underscore ("_").991 Si il y a un espace, nous séparons le nom du contact en \c firstName et 992 \c lastName. Finalement, nous remplaçons l'espace par un underscore ("_"). 1023 993 Si il n'y a pas d'espace, nous supposons que le contact ne comprend que 1024 le pr énom.994 le prénom. 1025 995 1026 996 \snippet tutorials/addressbook/part7/addressbook.cpp export function part1 1027 997 1028 Comme pour la m éthode \c saveToFile(), nous ouvrons une boîte de dialogue1029 pour donner la possibilit é àl'utilisateur de choisir un emplacement pour1030 le fichier. Avec le nom de fichier choisi, nous cr éons une instance de QFile1031 pour y écrire.998 Comme pour la méthode \c saveToFile(), nous ouvrons une boîte de dialogue 999 pour donner la possibilité à l'utilisateur de choisir un emplacement pour 1000 le fichier. Avec le nom de fichier choisi, nous créons une instance de QFile 1001 pour y écrire. 1032 1002 1033 1003 Nous essayons d'ouvrir le fichier en mode \l{QIODevice::}{WriteOnly}. Si 1034 cela échoue, nous affichons un QMessageBox pour informer l'utilisateur1035 à propos de l'origine du problème et nous quittons la méthode. Sinon, nous passons le1036 fichier comme param ètre pour créer un objet QTextStream, \c out. De la même façon que1037 QDataStream, la classe QTextStream fournit les fonctionnalit és pour1038 lire et écrire des fichiers de texte. Grâce à celà, le fichier \c{.vcf}1039 g énéré pourra être ouvert et édité à l'aide d'un simple éditeur de texte.1004 cela échoue, nous affichons un QMessageBox pour informer l'utilisateur 1005 à propos de l'origine du problÚme et nous quittons la méthode. Sinon, nous passons le 1006 fichier comme paramÚtre pour créer un objet QTextStream, \c out. De la même façon que 1007 QDataStream, la classe QTextStream fournit les fonctionnalités pour 1008 lire et écrire des fichiers de texte. Grâce à celà , le fichier \c{.vcf} 1009 généré pourra être ouvert et édité à l'aide d'un simple éditeur de texte. 1040 1010 1041 1011 \snippet tutorials/addressbook/part7/addressbook.cpp export function part2 1042 1012 1043 Nous écrivons ensuite un fichier vCard avec la balise \c{BEGIN:VCARD},1013 Nous écrivons ensuite un fichier vCard avec la balise \c{BEGIN:VCARD}, 1044 1014 suivit par \c{VERSION:2.1}. 1045 Le nom d'un contact est écrit àl'aide de la balise \c{N:}. Pour la balise1046 \c{FN:}, qui remplit le titre du contact, nous devons v érifier si le contact1047 à un nom de famille défini ou non. Si oui, nous utilions les détails de1048 \c nameList pour remplir le champ, dans le cas contraire on écrit uniquement le contenu1015 Le nom d'un contact est écrit à l'aide de la balise \c{N:}. Pour la balise 1016 \c{FN:}, qui remplit le titre du contact, nous devons vérifier si le contact 1017 à un nom de famille défini ou non. Si oui, nous utilions les détails de 1018 \c nameList pour remplir le champ, dans le cas contraire on écrit uniquement le contenu 1049 1019 de \c firstName. 1050 1020 1051 1021 \snippet tutorials/addressbook/part7/addressbook.cpp export function part3 1052 1022 1053 Nous continuons en écrivant l'adresse du contact. Les points-virgules1054 dans l'adresse sont échappés àl'aide de "\\", les retours de ligne sont1055 remplac és par des points-virgules, et les vigules sont remplacées par des espaces.1056 Finalement nous écrivons les balises \c{ADR;HOME:;} suivies par l'adresse1023 Nous continuons en écrivant l'adresse du contact. Les points-virgules 1024 dans l'adresse sont échappés à l'aide de "\\", les retours de ligne sont 1025 remplacés par des points-virgules, et les vigules sont remplacées par des espaces. 1026 Finalement nous écrivons les balises \c{ADR;HOME:;} suivies par l'adresse 1057 1027 et la balise \c{END:VCARD}. 1058 1028 1059 1029 \snippet tutorials/addressbook/part7/addressbook.cpp export function part4 1060 1030 1061 À la fin de la méthode, un QMessageBox est affichépour informer l'utilisateur1062 que la vCard a été exportée avec succès.1063 1064 \e{vCard est une marque d éposée de \l{http://www.imc.org}1031 à la fin de la méthode, un QMessageBox est affiché pour informer l'utilisateur 1032 que la vCard a été exportée avec succÚs. 1033 1034 \e{vCard est une marque déposée de \l{http://www.imc.org} 1065 1035 {Internet Mail Consortium}}. 1066 1036 */
Note:
See TracChangeset
for help on using the changeset viewer.