Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/doc/src/tutorials/addressbook-fr.qdoc

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    77** This file is part of the documentation of the Qt Toolkit.
    88**
    9 ** $QT_BEGIN_LICENSE:LGPL$
     9** $QT_BEGIN_LICENSE:FDL$
    1010** Commercial Usage
    1111** Licensees holding valid Qt Commercial licenses may use this file in
    1212** accordance with the Qt Commercial License Agreement provided with the
    13 ** Software or, alternatively, in accordance with the terms contained in
    14 ** a written agreement between you and Nokia.
     13** Software or, alternatively, in accordance with the terms contained in a
     14** written agreement between you and Nokia.
    1515**
    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.
    3521**
    3622** If you have questions regarding the use of this file, please contact
     
    4329    \page tutorials-addressbook-fr.html
    4430
    45     \startpage {index.html}{Qt Reference Documentation}
    46     \contentspage Tutorials
    47     \nextpage {tutorials/addressbook-fr/part1}{Chapitre 1}
    48 
    4931    \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.
    5436
    5537    \image addressbook-tutorial-screenshot.png
    5638
    57     Ce tutoriel va nous amener à découvrir quelques technologies fondamentales fournies
     39    Ce tutoriel va nous amener à découvrir quelques technologies fondamentales fournies
    5840    par Qt, tel que:
    5941
    6042    \list
    61     \o Les Widgets et leur mise en page à l'aide des layouts
     43    \o Les Widgets et leur mise en page à l'aide des layouts
    6244    \o Les signaux et slots
    63     \o Les structures de données de collections
    64     \o Les entrées/sorties
     45    \o Les structures de données de collections
     46    \o Les entrées/sorties
    6547    \endlist
    6648
    6749    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/addressbook
     50    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
    7153
    7254    Les chapitres du tutoriel:
     
    7557    \o \l{tutorials/addressbook-fr/part1}{Conception de l'interface utilisateur}
    7658    \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}
    7961    \o \l{tutorials/addressbook-fr/part5}{Ajout d'une fonction de recherche}
    8062    \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}
    8264    \endlist
    8365
    84     La petite application que nous développerons ici ne possède pas tous les éléments
     66    La petite application que nous développerons ici ne possÚde pas tous les éléments
    8567    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'exemple
    89     "\l{mainwindows/application}{Application}", qui présente une interface simple utilisant
    90     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.
    9173
    9274*/
     
    9476/*!
    9577    \page tutorials-addressbook-fr-part1.html
    96     \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire}
    97     \nextpage {tutorials/addressbook-fr/part2}{Chapitre 2}
     78
    9879    \example tutorials/addressbook-fr/part1
    9980    \title Carnet d'adresses 1 - Conception de l'interface utilisateur
    10081
    101     La première partie de ce tutoriel traite de la conception d'une interface graphique
     82    La premiÚre partie de ce tutoriel traite de la conception d'une interface graphique
    10283    (GUI) basique, que l'on utilisera pour l'application Carnet d'adresses.
    10384
    104     La première étape dans la création d'applications graphiques est la conception de
    105     l'interface utilisateur. Dans ce chapitre, nous verrons comment créer les labels
    106     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.
    10889
    10990    \image addressbook-tutorial-part1-screenshot.png
     
    11192    Nous allons avoir besoin de deux objets QLabel, \c nameLabel et \c addressLabel,
    11293    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'un
    114     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.
    11596
    11697    \image addressbook-tutorial-part1-labeled-screenshot.png
    11798
    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:
    119100
    120101    \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 classe
     102        \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
    123104            \c AddressBook
    124         \o \c{main.cpp} - le fichier qui contient la méthode \c main() , et
     105        \o \c{main.cpp} - le fichier qui contient la méthode \c main() , et
    125106        une instance de la classe \c AddressBook.
    126107    \endlist
    127108
    128     \section1 Programmation en Qt - héritage
    129 
    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és
    134     ou de collections de widgets. Utiliser l'héritage afin de compléter
    135     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:
    136117
    137118    \list
    138     \o La possibilité d'implémenter des méthodes virtuelles et des méthodes
    139     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.
    141122    \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 des
     123    afin que les autres parties de l'application n'aient pas à se soucier de chacun des
    143124    widgets qui forment l'interface utilisateur.
    144     \o La classe fille peut être utilisée pour créer de nombreux widgets personnalisés
    145     dans une même application ou bibliothèque, et le code de la classe fille peut être
    146     réutilisé dans d'autres projets
     125    \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
    147128    \endlist
    148129
    149130    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'un
     131    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
    152133    widget carnet d'adresses basique.
    153134
     
    156137
    157138    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éclarer
    161     un constructeur. On utilise également la macro Q_OBJECT pour indiquer que la classe
    162     exploite les fonctionnalités de signaux et slots offertes par Qt ainsi que
    163     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.
    164145
    165146    \snippet tutorials/addressbook-fr/part1/addressbook.h class definition
    166147
    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 contenues
    170     dans \c nameLine et \c addressText sont nécessaires à de nombreuses méthodes
     148    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
    171152    du carnet d'adresses.
    172153
    173     Il n'est pas nécessaire de déclarer les objets QLabel que nous allons utiliser
    174     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.
    178159    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 allons
    182     passer à l'implémentation du fichier \c addressbook.cpp.
    183 
    184     \section1 Implémentation de la classe AddressBook
    185 
    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 utile
    189     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.
    191172
    192173
    193174    \snippet tutorials/addressbook/part1/addressbook.cpp constructor and input fields
    194175
    195     à l'intérieur de ce constructeur, on déclare et instancie deux objets locaux
    196     QLabel, \c nameLabel et \c addressLabel, de même on instancie \c nameLine et
    197     \c addressText. La méthode \l{QObject::tr()}{tr()} renvoie une version traduite
    198     de la chaîne de caractères, si elle existe; dans le cas contraire, elle renvoie
    199     la chaîne elle même. On peut voir cette méthode comme un marqueur \tt{<insérer
    200     la traduction ici>}, permettant de repérer les objets QString à considérer
    201     pour traduire une application. Vous remarquerez, dans les chapitres à venir
    202     comme dans les \l{Qt Examples}{exemples Qt}, qu'elle est utilisée chaque fois
    203     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.
    204185
    205186    Lorsque l'on programme avec Qt, il est utile de savoir comment fonctionnent les
    206187    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.
    208189
    209190    \image addressbook-tutorial-part1-labeled-layout.png
    210191
    211     On utilise un QGridLayout pour positionner nos labels et champs de saisie de manière
    212     structurée. QGridLayout divise l'espace disponible en une grille, et place les
    213     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 cette
    215     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:
    216197
    217198    \snippet tutorials/addressbook/part1/addressbook.cpp layout
    218199
    219     On remarque que le label \c AddressLabel est positionné en utilisant Qt::AlignTop
    220     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,
    222203    consultez la section \l{Layout Management}.
    223204
    224     Afin d'installer l'objet layout dans un widget, il faut appeler la méthode
     205    Afin d'installer l'objet layout dans un widget, il faut appeler la méthode
    225206    \l{QWidget::setLayout()}{setLayout()} du widget en question:
    226207
    227208    \snippet tutorials/addressbook/part1/addressbook.cpp setting the layout
    228209
    229     Enfin, on initialise le titre du widget à "Simple Address Book"
    230 
    231     \section1 Exécution de l'application
    232 
    233     Un fichier séparé, \c main.cpp, est utilisé pour la méthode \c main(). Dans cette
    234     fonction, on crée une instance de QApplication, \c app. QApplication se charge de
    235     des ressources communes à l'ensemble de l'application, tel que les polices de
    236     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.
    237218    De ce fait, il y a toujours un objet QApplication dans toute application graphique en Qt.
    238219
     
    240221
    241222    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ènements
    244     n'aura pas été lancée. On démarre la boucle d'évènements en appelant la
    245     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éthode
     223    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
    247228    \c main().
    248     On comprend maintenant pourquoi \c AddressBook a été créé sur la pile: à la fin
     229    On comprend maintenant pourquoi \c AddressBook a été créé sur la pile: à la fin
    249230    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.
    251232*/
    252233
    253234/*!
    254235    \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
    258237    \example tutorials/addressbook-fr/part2
    259238    \title Carnet d'adresses 2 - Ajouter des adresses
    260239
    261     La prochaine étape pour créer notre carnet d'adresses est d'ajouter un soupçon
    262     d'interactivité.
     240    La prochaine étape pour créer notre carnet d'adresses est d'ajouter un soupçon
     241    d'interactivité.
    263242
    264243    \image addressbook-tutorial-part2-add-contact.png
    265244
    266245    Nous allons fournir un bouton que l'utilisateur peut
    267     cliquer pour ajouter un nouveau contact. Une structure de données est aussi
    268     nécessaire afin de pouvoir stocker les contacts en mémoire.
    269 
    270     \section1 Définition de la classe AddressBook
     246    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
    271250
    272251    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.
    274253    Cela veut dire que notre fichier \c addressbook.h a maintenant trois
    275254    objets QPushButton et trois slots publics correspondant.
     
    277256    \snippet tutorials/addressbook/part2/addressbook.h slots
    278257
    279     Un slot est une méthode qui répond à un signal. Nous allons
    280     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 pouvez
    282     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}.
    283262
    284263    Les trois objets QPushButton \c addButton, \c submitButton et \c cancelButton
    285     sont maintenant inclus dans la déclaration des variables privées, avec
    286     \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.
    287266
    288267    \snippet tutorials/addressbook/part2/addressbook.h pushbutton declaration
    289268
    290269    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 stocker
    293     des paires clé-valeur: le nom du contact est la \e{clé} et l'adresse du contact
     270    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
    294273    est la \e{valeur}.
    295274
    296275    \snippet tutorials/addressbook/part2/addressbook.h remaining private variables
    297276
    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 contact
    300     affiché avant que l'utilisateur ne clique sur le bouton "Add". Grâce à ces variables
     277    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
    301280    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 AddressBook
     281    à l'affichage du dernier contact.
     282
     283    \section1 Implémentation de la classe AddressBook
    305284
    306285    Dans le constructeur de \c AddressBook, \c nameLine et
    307     \c addressText sont mis en mode lecture seule, de façon à autoriser l'affichage
     286    \c addressText sont mis en mode lecture seule, de façon à autoriser l'affichage
    308287    mais pas la modification du contact courant.
    309288
     
    318297    \snippet tutorials/addressbook/part2/addressbook.cpp pushbutton declaration
    319298
    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 invoquant
    322     \l{QPushButton::hide()}{hide()}. Ces deux boutons ne seront affichés que lorsque
    323     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.
    325304
    326305    \snippet tutorials/addressbook/part2/addressbook.cpp connecting signals and slots
    327306
    328307    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.
    330309    L'image ci-dessous illustre ceci:
    331310
     
    337316    \snippet tutorials/addressbook/part2/addressbook.cpp vertical layout
    338317
    339     La methode \l{QBoxLayout::addStretch()}{addStretch()} est utilisée pour
    340     assurer que les boutons ne sont pas répartis uniformément, mais regroupés
    341     dans la partie supperieure du widget. La figure ci-dessous montre la différence
    342     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.
    343322
    344323    \image addressbook-tutorial-part2-stretch-effects.png
    345324
    346     Ensuite nous ajoutons \c buttonLayout1 à \c mainLayout, en utilisant
     325    Ensuite nous ajoutons \c buttonLayout1 à \c mainLayout, en utilisant
    347326    \l{QGridLayout::addLayout()}{addLayout()}. Ceci nous permet d'imbriquer les
    348327    mises en page puisque \c buttonLayout1 est maintenant un enfant de \c mainLayout.
     
    350329    \snippet tutorials/addressbook/part2/addressbook.cpp grid layout
    351330
    352     Les coordonnées du layout global ressemblent maintenant à ça:
     331    Les coordonnées du layout global ressemblent maintenant à ça:
    353332
    354333    \image addressbook-tutorial-part2-labeled-layout.png
    355334
    356     Dans la méthode \c addContact(), nous stockons les détails du dernier
    357     contact affiché dans \c oldName et \c oldAddress. Ensuite, nous
    358     vidons ces champs de saisie et nous désactivons le mode
    359     lecture seule. Le focus est placé sur \c nameLine et on affiche
     335    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
    360339    \c submitButton et \c cancelButton.
    361340
    362341    \snippet tutorials/addressbook/part2/addressbook.cpp addContact
    363342
    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:
    365344
    366345    \list 1
    367     \o Nous extrayons les détails du contact depuis \c nameLine et \c addressText
     346    \o Nous extrayons les détails du contact depuis \c nameLine et \c addressText
    368347    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 saisie
    370     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.
    372351
    373352    \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part1
    374353
    375     \o Ensuite, nous vérifions si le contact existe déjà. Si aucun contacts
    376     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 à
    377356    \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é.
    379358
    380359    \snippet tutorials/addressbook/part2/addressbook.cpp submitContact part2
    381360
    382     Si le contact existe déjà, nous affichons un QMessageBox pour informer
    383     l'utilisateur du problème.
    384     Notre objet \c contacts est basé sur des paires clé-valeur formés par
    385     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 code
     361    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
    389368    suivant:
    390369
     
    393372    \endlist
    394373
    395     La capture d'écran ci-dessous montre l'affichage fournit par un objet
    396     QMessageBox, utilisé ici pour afficher un message d'information
    397     à 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:
    398377
    399378    \image addressbook-tutorial-part2-add-successful.png
    400379
    401     La méthode \c cancel() restaure les détails du dernier contact, active
     380    La méthode \c cancel() restaure les détails du dernier contact, active
    402381    \c addButton, et cache \c submitButton et \c cancelButton.
    403382
    404383    \snippet tutorials/addressbook/part2/addressbook.cpp cancel
    405384
    406     L'idée générale pour augmenter la flexibilité lors de l'ajout d'un
    407     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ées
     385    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
    410389    jusqu'ici:
    411390
     
    415394/*!
    416395    \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
    420397    \example tutorials/addressbook-fr/part3
    421     \title Carnet d'adresses 3 - Navigation entre les éléments
    422 
    423     L'application "Carnet d'adresses" est maintenant à moitié terminée. Il
     398    \title Carnet d'adresses 3 - Navigation entre les éléments
     399
     400    L'application "Carnet d'adresses" est maintenant à moitié terminée. Il
    424401    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 de
    426     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.
    430407    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ées
    434     similaire à une liste liée, où tous les éléments sont connectés, y compris
    435     le premier et le dernier élément. La figure ci-dessous illustre cette structure
    436     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.
    437414
    438415    \image addressbook-tutorial-part3-linkedlist.png
    439416
    440     \section1 Définition de la classe AddressBook
     417    \section1 Définition de la classe AddressBook
    441418
    442419    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:
    445422
    446423    \snippet tutorials/addressbook/part3/addressbook.h navigation functions
    447424
    448425    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.
    450427
    451428    \snippet tutorials/addressbook/part3/addressbook.h navigation pushbuttons
    452429
    453     \section1 Implémentation de la classe AddressBook
    454 
    455     A l'intérieur du constructeur de \c AddressBook, dans \c addressbook.cpp, nous
    456     instancions \c nextButton et \c previousButton et nous les désactivons
    457     par défaut. Nous faisons ceci car la navigation ne doit être activée
     430    \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
    458435    que lorsqu'il y a plus d'un contact dans le carnet d'adresses.
    459436
    460437    \snippet tutorials/addressbook/part3/addressbook.cpp navigation pushbuttons
    461438
    462     Nous connectons alors ces boutons à leur slots respectifs:
     439    Nous connectons alors ces boutons à leur slots respectifs:
    463440
    464441    \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals
    465442
    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 programme
     443    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
    468445    complet.
    469446
     
    471448
    472449    Nous suivons les conventions pour les fonctions \c next() et \c previous()
    473     en plaçant \c nextButton à droite et \c previousButton à gauche. Pour
     450    en plaçant \c nextButton à droite et \c previousButton à gauche. Pour
    474451    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:
    476453
    477454    \snippet tutorials/addressbook/part3/addressbook.cpp navigation layout
    478455
    479     L'objet QHBoxLayout, \c buttonLayout2, est ensuite ajouté à \c mainLayout.
     456    L'objet QHBoxLayout, \c buttonLayout2, est ensuite ajouté à \c mainLayout.
    480457
    481458    \snippet tutorials/addressbook/part3/addressbook.cpp adding navigation layout
    482459
    483     La figure ci-dessous montre les systèmes de coordonnées pour les widgets du
     460    La figure ci-dessous montre les systÚmes de coordonnées pour les widgets du
    484461    \c mainLayout.
    485462    \image addressbook-tutorial-part3-labeled-layout.png
    486463
    487     Dans notre méthode \c addContact(), nous avons desactivé ces boutons
    488     pour être sûr que l'utilisateur n'utilise pas la navigation lors de
     464    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
    489466    l'ajout d'un contact.
    490467
    491468    \snippet tutorials/addressbook/part3/addressbook.cpp disabling navigation
    492469
    493     Dans notre méthode \c submitContact(), nous activons les boutons de
     470    Dans notre méthode \c submitContact(), nous activons les boutons de
    494471    navigation, \c nextButton et \c previousButton, en fonction de la
    495     taille de \c contacts. Commen mentionné plus tôt, la navigation n'est
    496     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.
    497474    Les lignes suivantes montrent comment faire cela:
    498475
     
    501478    Nous incluons aussi ces lignes de code dans le bouton \c cancel().
    502479
    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érateur
    505     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:
    506483
    507484    \list
    508         \o Si l'itérateur n'est pas à la fin de \c contacts, nous l'incrémentons
    509         \o Si l'itérateur est à la fin de \c contacts, nous changeons sa position
    510         jusqu'au début de \c contacts. Cela donne l'illusion que notre QMap
     485        \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
    511488        fonctionne comme une liste circulaire.
    512489    \endlist
     
    514491    \snippet tutorials/addressbook/part3/addressbook.cpp next() function
    515492
    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,
    517494    nous affichons son contenu sur \c nameLine et \c addressText.
    518495
    519     De la même façon, pour la méthode \c previous(), nous obtenons un
    520     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:
    521498
    522499    \list
    523         \o Si l'itérateur est à la fin de \c contacts, on réinitialise
     500        \o Si l'itérateur est à la fin de \c contacts, on réinitialise
    524501           l'affichage et on retourne.
    525         \o Si l'itérateur est au début de \c contacts, on change sa
    526            position jusqu'à la fin
    527         \o Ensuite, on décrémente l'itérateur
     502        \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
    528505    \endlist
    529506
    530507    \snippet tutorials/addressbook/part3/addressbook.cpp previous() function
    531508
    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.
    533510
    534511*/
     
    537514
    538515    \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
    542517    \example tutorials/addressbook-fr/part4
    543     \title Carnet d'Adresses 4 - éditer et supprimer des adresses
    544 
    545 
    546     Dans ce chapitre, nous verrons comment modifier les données des contacts
     518    \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
    547522    contenus dans l'application carnet d'adresses.
    548523
     
    551526
    552527    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 la
    554     navigation. Il serait pratique d'inclure des fonctions telles qu'éditer et
    555     supprimer, afin que les détails associés à un contact puissent être
    556     modifiés lorsque c'est nécessaire. Cependant, cela requiert une légère
    557     modification, sous la forme d'énumérations. Au chapitre précédent, nous avions deux
    558     modes: \c {AddingMode} et \c {NavigationMode}, mais ils n'étaient pas
    559     définis en tant qu'énumérations. Au lieu de ça, on activait et désactivait les
     528    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
    560535    boutons correspondants manuellement, au prix de multiples redondances dans
    561536    le code.
    562537
    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.
    564539
    565540    \list
     
    569544    \endlist
    570545
    571     \section1 Définition de la classe AddressBook
    572 
    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 :
    574549
    575550    \snippet tutorials/addressbook/part4/addressbook.h Mode enum
    576551
    577     On ajoute également deux nouveaux slots, \c editContact() et
    578     \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.
    579554
    580555    \snippet tutorials/addressbook/part4/addressbook.h edit and remove slots
    581556
    582     Afin de basculer d'un mode à l'autre, on introduit la méthode
    583     \c updateInterface() pour contrôller l'activation et la désactivation de
    584     tous les objets QPushButton. On ajoute également deux nouveaux boutons,
    585     \c editButton et \c removeButton, pour les fonctions d'édition
    586     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.
    587562
    588563    \snippet tutorials/addressbook/part4/addressbook.h updateInterface() declaration
     
    592567    \snippet tutorials/addressbook/part4/addressbook.h mode declaration
    593568
    594     Enfin, on déclare \c currentMode pour garder une trace du mode
    595     actuellement utilisé.
    596 
    597     \section1 Implémentation de la classe AddressBook
    598 
    599     Il nous faut maintenant implémenter les fonctionnalités de changement de
     569    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
    600575    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 le
    602     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.
    603578
    604579    \snippet tutorials/addressbook/part4/addressbook.cpp edit and remove buttons
    605580
    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 à
    608583    \c buttonLayout1.
    609584
     
    612587    \snippet tutorials/addressbook/part4/addressbook.cpp adding edit and remove to the layout
    613588
    614     La methode \c editContact() place les anciens détails du contact dans
     589    La methode \c editContact() place les anciens détails du contact dans
    615590    \c oldName et \c oldAddress, avant de basculer vers le mode
    616591    \c EditingMode. Dans ce mode, les boutons \c submitButton et
    617     \c cancelButton sont tous deux activés, l'utilisateur peut par conséquent
    618     modifier les détails du contact et cliquer sur l'un de ces deux boutons
     592    \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
    619594    par la suite.
    620595
    621596    \snippet tutorials/addressbook/part4/addressbook.cpp editContact() function
    622597
    623     La méthode \c submitContact() a été divisée en deux avec un bloc
     598    La méthode \c submitContact() a été divisée en deux avec un bloc
    624599    \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.
    626601
    627602    \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function beginning
     
    630605
    631606    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 supprime
    633     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.
    634609
    635610    \snippet tutorials/addressbook/part4/addressbook.cpp submitContact() function part2
    636611
    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ègle
    639     \c currentMode à \c NavigationMode. C'est une étape importante puisque
    640     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éthode
    643     \c removeContact(). Cette méthode vérifie que le contact est présent dans
     612    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
    644619    \c contacts.
    645620
    646621    \snippet tutorials/addressbook/part4/addressbook.cpp removeContact() function
    647622
    648     Si c'est le cas, on affiche une boîte de dialogue QMessageBox, demandant
    649     confirmation de la suppression à l'utilisateur. Une fois la confirmation
    650     effectuée, on appelle \c previous(), afin de s'assurer que l'interface
    651     utilisateur affiche une autre entrée, et on supprime le contact en
    652     utilisant le méthode \l{QMap::remove()}{remove()} de \l{QMap}. Dans un
     623    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
    653628    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 cette
    655     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.
    656631
    657632    \image addressbook-tutorial-part4-remove.png
    658633
    659     \section2 Mise à jour de l'Interface utilisateur
    660 
    661     On a évoqué plus haut la méthode \c updateInterface() comme moyen
    662     d'activer et de désactiver les différents boutons de l'interface en
    663     fonction du mode. Cette méthode met à jour le mode courant selon
    664     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,
    665640    avant de tester sa valeur.
    666641
    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.
    668643    Le code source pour les cas \c AddingMode et \c EditingMode est visible
    669644    ci-dessous:
     
    672647
    673648    Dans le cas de \c NavigationMode, en revanche, des tests conditionnels
    674     sont passés en paramètre de QPushButton::setEnabled(). Ceci permet de
    675     s'assurer que les boutons \c editButton et \c removeButton ne sont activés
     649    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
    676651    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 existe
     652    \c nextButton et \c previousButton ne sont activés que lorsqu'il existe
    678653    plus d'un contact dans le carnet d'adresses.
    679654
    680655    \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 2
    681656
    682     En effectuant les opérations de réglage du mode et de mise à jour de
    683     l'interface utilisateur au sein de la même méthode, on est à l'abri de
    684     l'éventualité où l'interface utilisateur se "désynchronise" de l'état
     657    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
    685660    interne de l'application.
    686661
     
    689664/*!
    690665    \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
    694667    \example tutorials/addressbook-fr/part5
    695668    \title Carnet d'adresse 5 - Ajout d'une fonction de recherche
    696669
    697     Dans ce chapitre, nous allons voir les possibilités pour rechercher
     670    Dans ce chapitre, nous allons voir les possibilités pour rechercher
    698671    des contacts dans le carnet d'adresse.
    699672
     
    704677    Dans ce cas, une fonction de recherche serait plus efficace pour rechercher
    705678    les contacts.
    706     La capture d'écran ci-dessus montre le bouton de recherche \e Find et sa position
     679    La capture d'écran ci-dessus montre le bouton de recherche \e Find et sa position
    707680    dans le paneau de bouton.
    708681
    709682    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.
    711684    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 FindDialog
     685    implémenter la class \c FindDialog.
     686
     687    \section1 Définition de la classe FindDialog
    715688
    716689    \image addressbook-tutorial-part5-finddialog.png
    717690
    718     Pour sous-classer QDialog, nous commençons par inclure le header de
    719     QDialog dans le fichier \c finddialog.h. De plus, nous déclarons les
     691    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
    720693    classes QLineEdit et QPushButton car nous utilisons ces widgets dans
    721694    notre classe dialogue.
    722695
    723696    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 à accepter
    725     un QWidget parent, même si cette boîte de dialogue sera affichée dans une
    726     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.
    727700
    728701    \snippet tutorials/addressbook/part5/finddialog.h FindDialog header
    729702
    730     Nous définissons la méthode publique \c getFindText() pour être utilisée
     703    Nous définissons la méthode publique \c getFindText() pour être utilisée
    731704    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(), est
    733     défini pour prendre en charge le texte lorsque l'utilisateur clique sur
     705    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
    734707    le bouton \gui Find.
    735708
    736     Finalement, nous définissons les variables privées \c findButton,
     709    Finalement, nous définissons les variables privées \c findButton,
    737710    \c lineEdit et \c findText, qui correspondent respectivement au bouton
    738711    \gui Find, au champ de texte dans lequel l'utilisateur tape le texte
    739     à rechercher, et à une variable interne stockant le texte pour une
    740     utilisation ultérieure.
    741 
    742     \section1 Implémentation de la classe FindDialog
     712    à rechercher, et à une variable interne stockant le texte pour une
     713    utilisation ultérieure.
     714
     715    \section1 Implémentation de la classe FindDialog
    743716
    744717    Dans le constructeur de \c FindDialog, nous instancions les objets des
    745     variables privées \c lineEdit, \c findButton et \c findText. Nous utilisons ensuite
     718    variables privées \c lineEdit, \c findButton et \c findText. Nous utilisons ensuite
    746719    un QHBoxLayout pour positionner les widgets.
    747720
    748721    \snippet tutorials/addressbook/part5/finddialog.cpp constructor
    749722
    750     Nous mettons en place la mise en page et le titre de la fenêtre, et
     723    Nous mettons en place la mise en page et le titre de la fenêtre, et
    751724    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 slot
     725    \l{QPushButton::clicked()}{clicked()} de \c{findButton} est connecté
     726    à \c findClicked() et \l{QDialog::accept()}{accept()}. Le slot
    754727    \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 classe
    757     \c{AddressBook} à savoir si l'objet \c FindDialog a été fermé. Ceci sera
    758     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().
    759732
    760733    \image addressbook-tutorial-part5-signals-and-slots.png
    761734
    762735    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 sans
    764     avoir entré un nom de contact. Ensuite, nous stockons le texte du champ
    765     d'entrée \c lineEdit dans \c findText. Et finalement nous vidons le
    766     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.
    767740
    768741    \snippet tutorials/addressbook/part5/finddialog.cpp findClicked() function
    769742
    770     La variable \c findText a un accesseur publique associé: \c getFindText().
    771     Étant donné que nous ne modifions \c findText directement que dans le
    772     constructeur et la méthode \c findClicked(), nous ne créons pas
    773     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().
    774747    Puisque \c getFindText() est publique, les classes instanciant et
    775     utilisant \c FindDialog peuvent toujours accéder à la chaîne de
    776     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é.
    777750
    778751    \snippet tutorials/addressbook/part5/finddialog.cpp getFindText() function
    779752
    780     \section1 Définition de la classe AddressBook
     753    \section1 Définition de la classe AddressBook
    781754
    782755    Pour utiliser \c FindDialog depuis la classe \c AddressBook, nous
     
    785758    \snippet tutorials/addressbook/part5/addressbook.h include finddialog's header
    786759
    787     Jusqu'ici, toutes les fonctionnalités du carnet d'adresses ont un
    788     QPushButton et un slot correspondant. De la même façon, pour la
    789     fonctionnalité \gui Find, nous avons \c findButton et \c findContact().
    790 
    791     Le \c findButton est déclaré comme une variable privée et la
    792     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.
    793766
    794767    \snippet tutorials/addressbook/part5/addressbook.h findContact() declaration
     
    796769    \snippet tutorials/addressbook/part5/addressbook.h findButton declaration
    797770
    798     Finalement, nous déclarons la variable privée \c dialog que nous allons
    799     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.
    800773
    801774    \snippet tutorials/addressbook/part5/addressbook.h FindDialog declaration
    802775
    803     Une fois que nous avons instancié la boîte de dialogue, nous voulons l'utiliser
    804     plus qu'une fois. Utiliser une variable privée nous permet d'y référer
    805     à plus d'un endroit dans la classe.
    806 
    807     \section1 Implémentation de la classe AddressBook
    808 
    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,
    810783    \c findbutton et \c findDialog:
    811784
     
    815788
    816789    Ensuite, nous connectons le signal \l{QPushButton::clicked()}{clicked()} de
    817     \c{findButton} à \c findContact().
     790    \c{findButton} à \c findContact().
    818791
    819792    \snippet tutorials/addressbook/part5/addressbook.cpp signals and slots for find
    820793
    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():
    822795
    823796    \snippet tutorials/addressbook/part5/addressbook.cpp findContact() function
    824797
    825     Nous commençons par afficher l'instance de \c FindDialog, \c dialog.
    826     L'utilisateur peut alors entrer le nom du contact à rechercher. Lorsque
    827     l'utilisateur clique sur le bouton \c findButton, la boîte de dialogue est
    828     masquée et le code de retour devient QDialog::Accepted. Ce code de retour
     798    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
    829802    vient remplir la condition du premier if.
    830803
    831804    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()
    833806    de \c FindDialog. Si le contact existe dans le carnet d'adresse, nous
    834807    l'affichons directement. Sinon, nous affichons le QMessageBox suivant pour
    835     indiquer que la recherche à échouée.
     808    indiquer que la recherche à échouée.
    836809
    837810    \image addressbook-tutorial-part5-notfound.png
     
    840813/*!
    841814    \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
    845816    \example tutorials/addressbook-fr/part6
    846817    \title Carnet d'Adresses 6 - Sauvegarde et chargement
    847818
    848     Ce chapitre couvre les fonctionnalités de gestion des fichiers de Qt que
    849     l'on utilise pour écrire les procédures de sauvegarde et chargement pour
     819    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
    850821    l'application carnet d'adresses.
    851822
     
    853824
    854825    Bien que la navigation et la recherche de contacts soient des
    855     fonctionnalités importantes, notre carnet d'adresses ne sera pleinement
     826    fonctionnalités importantes, notre carnet d'adresses ne sera pleinement
    856827    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 and
    859     Networking}{entrées et sorties}, mais nous avons choisi de nous contenter d'une
    860     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, et
    863     dans lequel on peut écrire. QFile est une classe fille de la classe plus
    864     générique QIODevice, qui peut représenter différents types de
    865     périphériques.
    866 
    867     Un objet QDataStream est utilisé pour sérialiser des données binaires
    868     dans le but de les passer à un QIODevice pour les récupérer dans le
    869     futur. Pour lire ou écrire dans un QIODevice, il suffit d'ouvrir le
    870     flux, avec le périphérique approprié en paramètre, et d'y lire ou
    871     écrire.
    872 
    873     \section1 Définition de la classe AddressBook
    874 
    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(),
    876847    ainsi que deux objets QPushButton, \c loadButton et \c saveButton.
    877848
     
    880851    \snippet tutorials/addressbook/part6/addressbook.h save and load buttons declaration
    881852
    882     \section1 Implémentation de la classe AddressBook
     853    \section1 Implémentation de la classe AddressBook
    883854
    884855    Dans notre constructeur, on instancie \c loadButton et \c saveButton.
    885     Idéalement, l'interface serait plus conviviale avec des boutons
     856    Idéalement, l'interface serait plus conviviale avec des boutons
    886857    affichant "Load contacts from a file" et "Save contacts to a file". Mais
    887858    compte tenu de la dimension des autres boutons, on initialise les labels
    888     des boutons à \gui{Load...} et \gui{Save...}. Heureusement, Qt offre une
    889     façon simple d'ajouter des info-bulles avec
    890     \l{QWidget::setToolTip()}{setToolTip()}, et nous l'exploitons de la façon
     859    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
    891862    suivante pour nos boutons:
    892863
     
    896867
    897868    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, et
     869    layout de droite, \c button1Layout, comme pour les fonctionnalités précédentes, et
    899870    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 fichier
     871    \l{QPushButton::clicked()}{clicked()} à leurs slots respectifs.
     872
     873    Pour la sauvegarde, on commence par récupérer le nom de fichier
    903874    \c fileName, en utilisant QFileDialog::getSaveFileName(). C'est une
    904     méthode pratique fournie par QFileDialog, qui ouvre une boîte de
    905     dialogue modale et permet à l'utilisateur d'entrer un nom de fichier ou
     875    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
    906877    de choisir un fichier \c{.abk} existant. Les fichiers \c{.abk}
    907     correspondent à l'extension choisie pour la sauvegarde des contacts de
     878    correspondent à l'extension choisie pour la sauvegarde des contacts de
    908879    notre carnet d'adresses.
    909880
    910881    \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part1
    911882
    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-
    913884    dessous.
    914885
    915886    \image addressbook-tutorial-part6-save.png
    916887
    917     Si \c fileName n'est pas vide, on crée un objet QFile, \c file, à partir
    918     de \c fileName. QFile fonctionne avec QDataStream puisqu'il dérive de
     888    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
    919890    QIODevice.
    920891
    921     Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au
    922     mode \l{QIODevice::}{WriteOnly}. Si cela échoue, on en informe
     892    Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au
     893    mode \l{QIODevice::}{WriteOnly}. Si cela échoue, on en informe
    923894    l'utilisateur avec une QMessageBox.
    924895
     
    926897
    927898    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ême
    929     version de flux soit utilisée pour la lecture et l'écriture. On s'assure
    930     que c'est le cas en spécifiant explicitement d'utiliser la
     899    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
    931902    \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.
    933904
    934905    \snippet tutorials/addressbook/part6/addressbook.cpp saveToFile() function part3
    935906
    936     Pour le chargement, on récupère également \c fileName en utilisant
    937     QFileDialog::getOpenFileName(). Cette méthode est l'homologue de
    938     QFileDialog::getSaveFileName() et affiche également une boîte de
    939     dialogue modale permettant à l'utilisateur d'entrer un nom de fichier ou
     907    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
    940911    de selectionner un fichier \c{.abk} existant, afin de le charger dans le
    941912    carnet d'adresses.
     
    943914    \snippet tutorials/addressbook/part6/addressbook.cpp loadFromFile() function part1
    944915
    945     Sous Windows, par exemple, cette méthode affiche une boîte de dialogue
    946     native pour la sélection de fichier, comme illustré sur la capture
    947     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:
    948919
    949920    \image addressbook-tutorial-part6-load.png
     
    951922    Si \c fileName n'est pas vide, on utilise une fois de plus un objet
    952923    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 notre
    954     implémentation de \c saveToFile(), si cette tentative s'avère
     924    \l{QIODevice::}{ReadOnly}. De même que précédemment dans notre
     925    implémentation de \c saveToFile(), si cette tentative s'avÚre
    955926    infructueuse, on en informe l'utilisateur par le biais d'une
    956927    QMessageBox.
     
    959930
    960931    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 les
    962     informations sérialisées vers la structure de données \c contacts. Notez
     932    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
    963934    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 de
    965     procéder serait de lire les contacts dans un objet QMap temporaire, et
     935    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
    966937    de copier uniquement les contacts n'existant pas encore dans
    967938    \c contacts.
     
    970941
    971942    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 lu
    973     contient effectivement des entrées de carnet d'adresses. Si c'est le
     943    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
    974945    cas, on affiche le premier contact; sinon on informe l'utilisateur du
    975     problème par une QMessageBox. Enfin, on met à jour l'interface afin
    976     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.
    977948*/
    978949
    979950/*!
    980951    \page tutorials-addressbook-fr-part7.html
    981     \previouspage {tutorials/addressbook-fr/part6}{Chapitre 6}
    982     \contentspage {Tutoriel "Carnet d'adresses"}{Sommaire}
     952
    983953    \example tutorials/addressbook-fr/part7
    984     \title Carnet d'adresse 7 - Fonctionnalités avancées
    985 
    986     Ce chapitre couvre quelques fonctionnalités additionnelles qui
     954    \title Carnet d'adresse 7 - Fonctionnalités avancées
     955
     956    Ce chapitre couvre quelques fonctionnalités additionnelles qui
    987957    feront de notre carnet d'adresses une application plus pratique
    988958    pour une utilisation quotidienne.
     
    991961
    992962    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 échanger
    995     ce type de données.
    996     Dans ce chapitre, nous étendrons notre carnet d'adresses pour permettre
     963    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
    997967    d'exporter des contacts dans des fichiers vCard \c{.vcf}.
    998968
    999     \section1 Définition de la classe AddressBook
     969    \section1 Définition de la classe AddressBook
    1000970
    1001971    Nous ajoutons un objet QPushButton, \c exportButton, et un slot
    1002     public correspondant, \c exportAsVCard(), à notre classe \c AddressBook
     972    public correspondant, \c exportAsVCard(), à notre classe \c AddressBook
    1003973    dans le fichier \c addressbook.h.
    1004974
     
    1007977    \snippet tutorials/addressbook/part7/addressbook.h exportButton declaration
    1008978
    1009     \section1 Implémentation de la classe AddressBook
     979    \section1 Implémentation de la classe AddressBook
    1010980
    1011981    Dans le constructeur de \c AddressBook, nous connectons le signal
    1012982    \l{QPushButton::clicked()}{clicked()} de \c{exportButton} au slot
    1013983    \c exportAsVCard().
    1014     Nous ajoutons aussi ce bouton à \c buttonLayout1, le layout responsable
     984    Nous ajoutons aussi ce bouton à \c buttonLayout1, le layout responsable
    1015985    du groupe de boutons sur la droite.
    1016986
    1017     Dans la méthode \c exportAsVCard(), nous commençons par extraire le
    1018     nom du contact dans \n name. Nous déclarons \c firstname, \c lastName et
     987    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
    1019989    \c nameList.
    1020990    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 et
    1022     \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 ("_").
    1023993    Si il n'y a pas d'espace, nous supposons que le contact ne comprend que
    1024     le prénom.
     994    le prénom.
    1025995
    1026996    \snippet tutorials/addressbook/part7/addressbook.cpp export function part1
    1027997
    1028     Comme pour la méthode \c saveToFile(), nous ouvrons une boîte de dialogue
    1029     pour donner la possibilité à l'utilisateur de choisir un emplacement pour
    1030     le fichier. Avec le nom de fichier choisi, nous créons une instance de QFile
    1031     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.
    10321002
    10331003    Nous essayons d'ouvrir le fichier en mode \l{QIODevice::}{WriteOnly}. Si
    1034     cela échoue, nous affichons un QMessageBox pour informer l'utilisateur
    1035     à propos de l'origine du problème et nous quittons la méthode. Sinon, nous passons le
    1036     fichier comme paramètre pour créer un objet QTextStream, \c out. De la même façon que
    1037     QDataStream, la classe QTextStream fournit les fonctionnalités pour
    1038     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.
    10401010
    10411011    \snippet tutorials/addressbook/part7/addressbook.cpp export function part2
    10421012
    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},
    10441014    suivit par \c{VERSION:2.1}.
    1045     Le nom d'un contact est écrit à l'aide de la balise \c{N:}. Pour la balise
    1046     \c{FN:}, qui remplit le titre du contact, nous devons vérifier si le contact
    1047     à un nom de famille défini ou non. Si oui, nous utilions les détails de
    1048     \c nameList pour remplir le champ, dans le cas contraire on écrit uniquement le contenu
     1015    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
    10491019    de \c firstName.
    10501020 
    10511021    \snippet tutorials/addressbook/part7/addressbook.cpp export function part3
    10521022
    1053     Nous continuons en écrivant l'adresse du contact. Les points-virgules
    1054     dans l'adresse sont échappés à l'aide de "\\", les retours de ligne sont
    1055     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'adresse
     1023    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
    10571027    et la balise \c{END:VCARD}.
    10581028
    10591029    \snippet tutorials/addressbook/part7/addressbook.cpp export function part4
    10601030
    1061     À la fin de la méthode, un QMessageBox est affiché pour informer l'utilisateur
    1062     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}
    10651035    {Internet Mail Consortium}}.
    10661036*/
  • trunk/doc/src/tutorials/addressbook.qdoc

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    77** This file is part of the documentation of the Qt Toolkit.
    88**
    9 ** $QT_BEGIN_LICENSE:LGPL$
     9** $QT_BEGIN_LICENSE:FDL$
    1010** Commercial Usage
    1111** Licensees holding valid Qt Commercial licenses may use this file in
    1212** accordance with the Qt Commercial License Agreement provided with the
    13 ** Software or, alternatively, in accordance with the terms contained in
    14 ** a written agreement between you and Nokia.
     13** Software or, alternatively, in accordance with the terms contained in a
     14** written agreement between you and Nokia.
    1515**
    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.
    3521**
    3622** If you have questions regarding the use of this file, please contact
     
    4329    \page tutorials-addressbook.html
    4430
    45     \startpage {index.html}{Qt Reference Documentation}
    46     \contentspage Tutorials
    47     \nextpage {tutorials/addressbook/part1}{Chapter 1}
    48 
    4931    \title Address Book Tutorial
    5032    \brief An introduction to GUI programming, showing how to put together a
    5133    simple yet fully-functioning application.
    5234
    53     This tutorial gives an introduction to GUI programming using the Qt
     35    This tutorial is an introduction to GUI programming with the Qt
    5436    cross-platform framework.
    5537
     
    6244    \endomit
    6345
    64     In the process, we will learn about some basic technologies provided by Qt,
    65     such as
     46    In this tutorial, you will learn about some of the basic
     47    components of Qt, including:
    6648
    6749    \list
     
    7254    \endlist
    7355
    74     If you are completely new to Qt, please read \l{How to Learn Qt} if you
    75     have not already done so.
    76 
    77     The tutorial's source code is located in Qt's \c examples/tutorials/addressbook
    78     directory.
    79 
    80     Tutorial chapters:
     56    If you are new to Qt, we recommend reading \l{How to Learn Qt} first.
     57
     58    Tutorial contents:
    8159
    8260    \list 1
     
    9068    \endlist
    9169
    92     Although this little application does not look much like a fully-fledged
    93     modern GUI application, it uses many of the basic techniques that are used
    94     in more complex applications. After you have worked through it, we
    95     recommend checking out the \l{mainwindows/application}{Application}
    96     example, which presents a small GUI application, with menus, toolbars, a
    97     status bar, and so on.
     70    The tutorial source code is located in \c{examples/tutorials/addressbook}.
     71
     72    Although this little application does not look much like a
     73    fully-fledged modern GUI application, it uses many of the basic
     74    elements that are used in more complex applications. After you
     75    have worked through this tutorial, we recommend reading the
     76    \l{mainwindows/application}{Application} example, which presents a
     77    small GUI application, with menus, toolbars, a status bar, and so
     78    on. 
    9879*/
    9980
    10081/*!
    10182    \page tutorials-addressbook-part1.html
    102     \contentspage {Address Book Tutorial}{Contents}
    103     \nextpage {tutorials/addressbook/part2}{Chapter 2}
     83
    10484    \example tutorials/addressbook/part1
    105     \title Address Book 1 - Designing the User Interface
    106 
    107     The first part of this tutorial covers the design of the basic graphical
    108     user interface (GUI) we use for the Address Book application.
    109 
    110     The first step to creating a GUI program is to design the user interface.
    111     In this chapter, our goal is to set up the labels and input fields needed
    112     to implement a basic address book application. The figure below is a
    113     screenshot of our expected output.
     85    \title Part 1 - Designing the User Interface
     86
     87    This first part covers the design of the basic graphical user
     88    interface (GUI) for our address book application.
     89
     90    The first step in creating a GUI program is to design the user
     91    interface.  Here the our goal is to set up the labels and input
     92    fields to implement a basic address book. The figure below is a
     93    screenshot of the expected output.
    11494
    11595    \image addressbook-tutorial-part1-screenshot.png
     
    170150    \snippet tutorials/addressbook/part1/addressbook.h class definition
    171151
    172     The class holds declarations of \c nameLine and \c addressText, the
    173     private instances of QLineEdit and QTextEdit mentioned earlier.
    174     You will see, in the coming chapters, that data stored in \c nameLine and
    175     \c addressText is needed for many of the address book's functions.
    176 
    177     We do not need to include declarations of the QLabel objects we will use
    178     because we will not need to reference them once they have been created.
    179     The way Qt tracks the ownership of objects is explained in the next section.
     152    The class holds declarations of \c nameLine and \c addressText,
     153    the private instances of QLineEdit and QTextEdit mentioned
     154    earlier.  The data stored in \c nameLine and \c addressText will
     155    be needed for many of the address book functions.
     156
     157    We don't include declarations of the QLabel objects we will use
     158    because we will not need to reference them once they have been
     159    created.  The way Qt tracks the ownership of objects is explained
     160    in the next section.
    180161
    181162    The Q_OBJECT macro itself implements some of the more advanced features of Qt.
     
    196177    \snippet tutorials/addressbook/part1/addressbook.cpp constructor and input fields
    197178
    198     Within this constructor, we declare and instantiate two local QLabel objects,
    199     \c nameLabel and \c addressLabel, as well as instantiate \c nameLine and
    200     \c addressText. The
    201     \l{QObject::tr()}{tr()} function returns a translated version of the
    202     string, if there is one available; otherwise, it returns the string itself.
    203     Think of this function as an \c{<insert translation here>} marker to mark
    204     QString objects for translation. You will notice, in the coming chapters as
    205     well as in the \l{Qt Examples}, that we include it whenever we use a
    206     translatable string.
     179    In this constructor, the QLabel objects \c nameLabel and \c
     180    addressLabel are instantiated, as well as \c nameLine and \c
     181    addressText. The \l{QObject::tr()}{tr()} function returns a
     182    translated version of the string, if there is one
     183    available. Otherwise it returns the string itself. This function
     184    marks its QString parameter as one that should be translated into
     185    other languages. It should be used wherever a translatable string
     186    appears.
    207187
    208188    When programming with Qt, it is useful to know how layouts work.
     
    255235/*!
    256236    \page tutorials-addressbook-part2.html
    257     \previouspage Address Book 1 - Designing the User Interface
    258     \contentspage {Address Book Tutorial}{Contents}
    259     \nextpage {tutorials/addressbook/part3}{Chapter 3}
     237
    260238    \example tutorials/addressbook/part2
    261     \title Address Book 2 - Adding Addresses
    262 
    263     The next step to creating our basic address book application is to allow
    264     a little bit of user interaction.
     239    \title Part 2 - Adding Addresses
     240
     241    The next step in creating the address book is to implement some
     242    user interactions.
    265243
    266244    \image addressbook-tutorial-part2-add-contact.png
     
    284262    to the \l{Signals and Slots} document.
    285263
    286     Three QPushButton objects: \c addButton, \c submitButton and
    287     \c cancelButton, are now included in our private variable declarations,
    288     along with \c nameLine and \c addressText from the last chapter.
     264    Three QPushButton objects (\c addButton, \c submitButton, and
     265    \c cancelButton) are now included in our private variable declarations,
     266    along with \c nameLine and \c addressText.
    289267
    290268    \snippet tutorials/addressbook/part2/addressbook.h pushbutton declaration
     
    408386/*!
    409387    \page tutorials-addressbook-part3.html
    410     \previouspage Address Book 2 - Adding Addresses
    411     \contentspage {Address Book Tutorial}{Contents}
    412     \nextpage {tutorials/addressbook/part4}{Chapter 4}
     388
    413389    \example tutorials/addressbook/part3
    414     \title Address Book 3 - Navigating between Entries
    415 
    416     The address book application is now half complete. We need to add some
    417     functions to navigate between contacts. But first, we have to decide
    418     what sort of a data structure we would like to use to hold these contacts.
    419 
    420     In Chapter 2, we used a QMap of key-value pairs with the contact's name
    421     as the \e key, and the contact's address as the \e value. This works well
    422     for our case. However, in order to navigate and display each entry, a
    423     little bit of enhancement is needed.
     390    \title Part 3 - Navigating between Entries
     391
     392    The address book is now about half complete. We should add the
     393    capability to navigate among the contacts, but first we must
     394    decide what sort of a data structure we need for containing these
     395    contacts.
     396
     397    In the previous section, we used a QMap of key-value pairs with
     398    the contact's name as the \e key, and the contact's address as the
     399    \e value. This works well for our case. However, in order to
     400    navigate and display each entry, a little bit of enhancement is
     401    needed.
    424402
    425403    We enhance the QMap by making it replicate a data structure similar to a
     
    432410    \section1 Defining the AddressBook Class
    433411
    434     In order to add navigation functions to the address book application, we
    435     need to add two more slots to our \c AddressBook class: \c next() and
    436     \c previous(). These are added to our \c addressbook.h file:
     412    To add navigation functions to the address book, we must add two
     413    more slots to the \c AddressBook class: \c next() and \c
     414    previous() to the \c addressbook.h file:
    437415
    438416    \snippet tutorials/addressbook/part3/addressbook.h navigation functions
     
    456434    \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals
    457435
    458     The image below is our expected graphical user interface. Notice that it
    459     is getting closer to our final application.
     436    The image below is the expected graphical user interface.
    460437
    461438    \image addressbook-tutorial-part3-screenshot.png
     
    526503/*!
    527504    \page tutorials-addressbook-part4.html
    528     \previouspage Address Book 3 - Navigating between Entries
    529     \contentspage {Address Book Tutorial}{Contents}
    530     \nextpage {tutorials/addressbook/part5}{Chapter 5}
     505
    531506    \example tutorials/addressbook/part4
    532     \title Address Book 4 - Editing and Removing Addresses
    533 
    534     In this chapter, we look at ways to modify the contents of contacts stored
    535     in the address book application.
     507    \title Part 4 - Editing and Removing Addresses
     508
     509    Now we look at ways to modify the contents of contacts stored in
     510    the address book.
    536511
    537512    \image addressbook-tutorial-screenshot.png
    538513
    539     We now have an address book that not only holds contacts in an organized
    540     manner, but also allows navigation. It would be convenient to include
    541     edit and remove functions so that a contact's details can be changed
    542     when needed. However, this requires a little improvement, in the form of
    543     enums. In our previous chapters, we had two modes: \c{AddingMode} and
    544     \c{NavigationMode} - but they were not defined as enums. Instead, we
    545     enabled and disabled the corresponding buttons manually, resulting in
    546     multiple lines of repeated code.
    547 
    548     In this chapter, we define the \c Mode enum with three different values:
     514    We now have an address book that not only holds contacts in an
     515    organized manner, but also allows navigation. It would be
     516    convenient to include edit and remove functions so that a
     517    contact's details can be changed when needed. However, this
     518    requires a little improvement, in the form of enums. We defined
     519    two modes: \c{AddingMode} and \c{NavigationMode}, but they were
     520    not defined as enum values. Instead, we enabled and disabled the
     521    corresponding buttons manually, resulting in multiple lines of
     522    repeated code.
     523
     524    Here we define the \c Mode enum with three different values:
    549525
    550526    \list
     
    580556    \section1 Implementing the AddressBook Class
    581557
    582     We now have to implement the mode-changing features of the address book
    583     application. The \c editButton and \c removeButton are instantiated and
    584     disabled by default, as the address book starts up with zero contacts in
    585     memory.
     558    We now implement the mode-changing features of the address
     559    book. The \c editButton and \c removeButton are instantiated and
     560    disabled by default. The address book starts with zero contacts
     561    in memory.
    586562
    587563    \snippet tutorials/addressbook/part4/addressbook.cpp edit and remove buttons
     
    654630    \snippet tutorials/addressbook/part4/addressbook.cpp update interface() part 2
    655631
    656     By performing the task of setting the mode and updating the user interface in
    657     the same function, we avoid the possibility of the user interface getting "out
    658     of sync" with the internal state of the application.
    659 */
     632    By setting the mode and updating the user interface in the same
     633    function, we avoid the possibility of the user interface getting
     634    out of sync with the internal state of the application.
     635  */
    660636
    661637/*!
    662638    \page tutorials-addressbook-part5.html
    663     \previouspage Address Book 4 - Editing and Removing Addresses
    664     \contentspage {Address Book Tutorial}{Contents}
    665     \nextpage {tutorials/addressbook/part6}{Chapter 6}
     639
    666640    \example tutorials/addressbook/part5
    667     \title Address Book 5 - Adding a Find Function
    668 
    669     In this chapter, we look at ways to locate contacts and addresses in
    670     the address book application.
     641    \title Part 5 - Adding a Find Function
     642
     643    Here we look at ways to locate contacts and addresses in the
     644    address book.
    671645
    672646    \image addressbook-tutorial-part5-screenshot.png
    673647
    674     As we keep adding contacts to our address book application, it becomes
    675     tedious to navigate them with the \e Next and \e Previous buttons. In this
    676     case, a \e Find function would be more efficient in looking up contacts.
    677     The screenshot above shows the \e Find button and its position on the panel
    678     of buttons.
    679 
    680     When the user clicks on the \e Find button, it is useful to display a
    681     dialog that can prompt the user for a contact's name. Qt provides QDialog,
    682     which we subclass in this chapter, to implement a \c FindDialog class.
     648    As we add contacts to our address book, it becomes tedious to
     649    navigate the list with the \e Next and \e Previous buttons. A \e
     650    Find function would be more efficient.  The screenshot above shows
     651    the \e Find button and its position on the panel of buttons.
     652
     653    When the user clicks on the \e Find button, it is useful to
     654    display a dialog that prompts for a contact's name. Qt provides
     655    QDialog, which we subclass here to implement a \c FindDialog
     656    class.
    683657
    684658    \section1 Defining the FindDialog Class
     
    807781/*!
    808782    \page tutorials-addressbook-part6.html
    809     \previouspage Address Book 5 - Adding a Find Function
    810     \contentspage {Address Book Tutorial}{Contents}
    811     \nextpage {tutorials/addressbook/part7}{Chapter 7}
     783
    812784    \example tutorials/addressbook/part6
    813     \title Address Book 6 - Loading and Saving
    814 
    815     This chapter covers the file handling features of Qt that we use to write
    816     loading and saving routines for the address book application.
     785    \title Part 6 - Loading and Saving
     786
     787    This part covers the Qt file handling features we use to write
     788    loading and saving routines for the address book.
    817789
    818790    \image addressbook-tutorial-part6-screenshot.png
    819791
    820     Although browsing and searching for contacts are useful features, our
    821     address book is not ready for use until we can save existing contacts and
    822     load them again at a later time.
     792    Although browsing and searching the contact list are useful
     793    features, our address book is not complete until we can save
     794    existing contacts and load them again at a later time.
    823795
    824796    Qt provides a number of classes for \l{Input/Output and Networking}
     
    931903/*!
    932904    \page tutorials-addressbook-part7.html
    933     \previouspage Address Book 6 - Loading and Saving
    934     \contentspage {Address Book Tutorial}{Contents}
     905
    935906    \example tutorials/addressbook/part7
    936     \title Address Book 7 - Additional Features
    937 
    938     This chapter covers some additional features that make the address book
    939     application more convenient for everyday use.
     907    \title Part 7 - Additional Features
     908
     909    This part covers some additional features that make the address
     910    book more convenient for the frequent user.
    940911
    941912    \image addressbook-tutorial-part7-screenshot.png
    942913
    943     Although our address book application is useful in its own right, it would
    944     be useful if we could exchange contact data with other applications.
    945     The vCard format is a popular file format that can be used for this purpose.
    946     In this chapter, we extend our address book client to allow contacts to
    947     be exported to vCard \c{.vcf} files.
     914    Although our address book is useful in isolation, it would be
     915    better if we could exchange contact data with other applications.
     916    The vCard format is a popular file format that can be used for
     917    this purpose.  Here we extend our address book client to allow
     918    contacts to be exported to vCard \c{.vcf} files.
    948919
    949920    \section1 Defining the AddressBook Class
  • trunk/doc/src/tutorials/widgets-tutorial.qdoc

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    77** This file is part of the documentation of the Qt Toolkit.
    88**
    9 ** $QT_BEGIN_LICENSE:LGPL$
     9** $QT_BEGIN_LICENSE:FDL$
    1010** Commercial Usage
    1111** Licensees holding valid Qt Commercial licenses may use this file in
    1212** accordance with the Qt Commercial License Agreement provided with the
    13 ** Software or, alternatively, in accordance with the terms contained in
    14 ** a written agreement between you and Nokia.
    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.
     13** Software or, alternatively, in accordance with the terms contained in a
     14** written agreement between you and Nokia.
     15**
     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.
    3521**
    3622** If you have questions regarding the use of this file, please contact
     
    4632    they are used to build GUI applications.
    4733
    48     \startpage {index.html}{Qt Reference Documentation}
    49     \contentspage Tutorials
    50     \nextpage {tutorials/widgets/toplevel}{Creating a Window}
    51 
    52 
    5334    \section1 Introduction
    5435
    55     Widgets are the basic building blocks of graphical user interface (GUI)
    56     applications made with Qt. Each GUI component, such as a button, label or
    57     text editor, is a widget and can be placed within an existing user
    58     interface or displayed as an independent window. Each type of component
    59     is provided by a particular subclass of QWidget, which is itself a
    60     subclass of QObject.
    61 
    62     QWidget is not an abstract class; it can be used as a container for other
    63     widgets, and can be subclassed with minimal effort to create custom
    64     widgets. It is most often used to create windows in which other widgets
    65     are placed.
    66 
    67     As with \l{QObject}s, widgets can be created with parent objects to
    68     indicate ownership, ensuring that objects are deleted when they are no
    69     longer used. With widgets, these parent-child relationships have an
    70     additional meaning: each child is displayed within the screen area
    71     occupied by its parent. This means that, when a window is deleted, all
    72     the widgets it contains are automatically deleted.
     36    Widgets are the basic building blocks for graphical user interface
     37    (GUI) applications built with Qt. Each GUI component (e.g.
     38    buttons, labels, text editor) is a \l{QWidget}{widget} that is
     39    placed somewhere within a user interface window, or is displayed
     40    as an independent window. Each type of widge is provided by a
     41    subclass of QWidget, which is itself a subclass of QObject.
     42
     43    QWidget is not an abstract class. It can be used as a container
     44    for other widgets, and it can be subclassed with minimal effort to
     45    create new, custom widgets. QWidget is often used to create a
     46    window inside which other \l{QWidget}s are placed.
     47
     48    As with \l{QObject}s, \l{QWidget}s can be created with parent
     49    objects to indicate ownership, ensuring that objects are deleted
     50    when they are no longer used. With widgets, these parent-child
     51    relationships have an additional meaning: Each child widget is
     52    displayed within the screen area occupied by its parent widget.
     53    This means that when you delete a window widget, all the child
     54    widgets it contains are also deleted.
    7355
    7456    \section1 Writing a main Function
    7557
    76     Many of the GUI examples in Qt follow the pattern of having a \c{main.cpp}
    77     file containing code to initialize the application, and a number of other
    78     source and header files containing the application logic and custom GUI
    79     components.
    80 
    81     A typical \c main() function, written in \c{main.cpp}, looks like this:
     58    Many of the GUI examples provided with Qt follow the pattern of
     59    having a \c{main.cpp} file, which contains the standard code to
     60    initialize the application, plus any number of other source/header
     61    files that contain the application logic and custom GUI components.
     62
     63    A typical \c main() function in \c{main.cpp} looks like this:
    8264
    8365    \snippet doc/src/snippets/widgets-tutorial/template.cpp main.cpp body
    8466
    85     We first construct a QApplication object which is configured using any
    86     arguments passed in from the command line. After any widgets have been
    87     created and shown, we call QApplication::exec() to start Qt's event loop.
    88     Control passes to Qt until this function returns, at which point we return
    89     the value we obtain from this function.
    90 
    91     In each part of this tutorial, we provide an example that is written
    92     entirely within a \c main() function. In more sophisticated examples, the
    93     code to set up widgets and layouts is written in other parts of the
    94     example. For example, the GUI for a main window may be set up in the
     67    First, a QApplication object is constructed, which can be
     68    configured with arguments passed in from the command line. After
     69    the widgets have been created and shown, QApplication::exec() is
     70    called to start Qt's event loop.  Control passes to Qt until this
     71    function returns. Finally, \c{main()} returns the value returned
     72    by QApplication::exec().
     73
     74    \section1 Simple widget examples
     75
     76    Each of theses simple widget examples is written entirely within
     77    the \c main() function.
     78
     79    \list
     80    \o \l {tutorials/widgets/toplevel} {Creating a window}
     81
     82    \o \l {tutorials/widgets/childwidget} {Creating child widgets}
     83
     84    \o \l {tutorials/widgets/windowlayout} {Using layouts}
     85
     86    \o \l {tutorials/widgets/nestedlayouts} {Nested layouts}
     87    \endlist
     88
     89    \section1 Real world widget examples
     90
     91    In these \l{Widget examples} {more advanced examples}, the code
     92    that creates the widgets and layouts is stored in other files. For
     93    example, the GUI for a main window may be created in the
    9594    constructor of a QMainWindow subclass.
    9695
    97     The \l{Widgets examples} are a good place to look for
    98     more complex and complete examples and applications.
    99 
    100     \section1 Building Examples and Tutorials
    101 
    102     If you obtained a binary package of Qt or compiled it yourself, the
    103     examples described in this tutorial should already be ready to run.
    104     However, if you may wish to modify them and recompile them, you need to
    105     perform the following steps:
     96    \section1 Building The Examples
     97
     98    If you installed a binary package to get Qt, or if you compiled Qt
     99    yourself, the examples described in this tutorial should already
     100    be built and ready to run. If you wish to modify and recompile
     101    them, follow these steps:
    106102
    107103    \list 1
    108     \o At the command line, enter the directory containing the example you
    109        wish to recompile.
    110     \o Type \c qmake and press \key{Return}. If this doesn't work, make sure
    111        that the executable is on your path, or enter its full location.
    112     \o On Linux/Unix and Mac OS X, type \c make and press \key{Return};
    113        on Windows with Visual Studio, type \c nmake and press \key{Return}.
     104
     105    \o From a command prompt, enter the directory containing the
     106       example you have modified.
     107
     108    \o Type \c qmake and press \key{Return}. If this doesn't work,
     109       make sure that the executable is on your path, or enter its
     110       full location.
     111
     112    \o On Linux/Unix and Mac OS X, type \c make and press
     113       \key{Return}; on Windows with Visual Studio, type \c nmake and
     114       press \key{Return}.
     115
    114116    \endlist
    115117
    116     An executable file should have been created within the current directory.
    117     On Windows, this file may be located within a \c debug or \c release
    118     subdirectory. You can run this file to see the example code at work.
    119 */
    120 
    121 /*!
    122     \page widgets-tutorial-toplevel.html
    123     \contentspage {Widgets Tutorial}{Contents}
    124     \previouspage {Widgets Tutorial}
    125     \nextpage {Widgets Tutorial - Child Widgets}
     118    An executable file is created in the current directory.  On
     119    Windows, this file may be located in a \c debug or \c release
     120    subdirectory. You can run this executable to see the example code
     121    at work.
     122*/
     123
     124/*!
    126125    \example tutorials/widgets/toplevel
    127126    \title Widgets Tutorial - Creating a Window
     
    152151    this, we pass a QWidget instance to a widget's constructor, as we will
    153152    demonstrate in the next part of this tutorial.
    154 */
    155 
    156 /*!
    157     \page widgets-tutorial-childwidget.html
    158     \contentspage {Widgets Tutorial}{Contents}
    159     \previouspage {Widgets Tutorial - Creating a Window}
    160     \nextpage {Widgets Tutorial - Using Layouts}
     153
     154*/
     155
     156/*!
    161157    \example tutorials/widgets/childwidget
    162158    \title Widgets Tutorial - Child Widgets
     
    186182
    187183/*!
    188     \page widgets-tutorial-windowlayout.html
    189     \contentspage {Widgets Tutorial}{Contents}
    190     \previouspage {Widgets Tutorial - Child Widgets}
    191     \nextpage {Widgets Tutorial - Nested Layouts}
    192184    \example tutorials/widgets/windowlayout
    193185    \title Widgets Tutorial - Using Layouts
     
    229221
    230222/*!
    231     \page widgets-tutorial-nestedlayouts.html
    232     \contentspage {Widgets Tutorial}{Contents}
    233     \previouspage {Widgets Tutorial - Using Layouts}
    234223    \example tutorials/widgets/nestedlayouts
    235224    \title Widgets Tutorial - Nested Layouts
Note: See TracChangeset for help on using the changeset viewer.