Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

Carnet d'Adresses 4 - éditer et supprimer des adresses

Files:

Dans ce chapitre, nous verrons comment modifier les données des contacts contenus dans l'application carnet d'adresses.

Nous avons maintenant un carnet d'adresses qui ne se contente pas de lister des contacts de façon ordonnée, mais permet également la navigation. Il serait pratique d'inclure des fonctions telles qu'éditer et supprimer, afin que les détails associés à un contact puissent être modifiés lorsque c'est nécessaire. Cependant, cela requiert une légère modification, sous la forme d'énumérations. Au chapitre précédent, nous avions deux modes: AddingMode et NavigationMode, mais ils n'étaient pas définis en tant qu'énumérations. Au lieu de ça, on activait et désactivait les boutons correspondants manuellement, au prix de multiples redondances dans le code.

Dans ce chapitre, on définit l'énumération Mode avec trois valeurs possibles.

  • NavigationMode,
  • AddingMode, et
  • EditingMode.

Définition de la classe AddressBook

Le fichier addressbook.h est mis a jour pour contenir l'énumération Mode :

     enum Mode { NavigationMode, AddingMode, EditingMode };

On ajoute également deux nouveaux slots, editContact() et removeContact(), à notre liste de slots publics.

     void editContact();
     void removeContact();

Afin de basculer d'un mode à l'autre, on introduit la méthode updateInterface() pour contrôller l'activation et la désactivation de tous les objets QPushButton. On ajoute également deux nouveaux boutons, editButton et removeButton, pour les fonctions d'édition et de suppression mentionnées plus haut.

     void updateInterface(Mode mode);
     ...
     QPushButton *editButton;
     QPushButton *removeButton;
     ...
     Mode currentMode;

Enfin, on déclare currentMode pour garder une trace du mode actuellement utilisé.

Implémentation de la classe AddressBook

Il nous faut maintenant implémenter les fonctionnalités de changement de mode de l'application carnet d'adresses. Les boutons editButton et removeButton sont instanciés et désactivés par défaut, puisque le carnet d'adresses démarre sans aucun contact en mémoire.

     editButton = new QPushButton(tr("&Edit"));
     editButton->setEnabled(false);
     removeButton = new QPushButton(tr("&Remove"));
     removeButton->setEnabled(false);

Ces boutons sont ensuite connectés à leurs slots respectifs, editContact() et removeContact(), avant d'être ajoutés à buttonLayout1.

     connect(editButton, SIGNAL(clicked()), this, SLOT(editContact()));
     connect(removeButton, SIGNAL(clicked()), this, SLOT(removeContact()));
     ...
     buttonLayout1->addWidget(editButton);
     buttonLayout1->addWidget(removeButton);

La methode editContact() place les anciens détails du contact dans oldName et oldAddress, avant de basculer vers le mode EditingMode. Dans ce mode, les boutons submitButton et cancelButton sont tous deux activés, l'utilisateur peut par conséquent modifier les détails du contact et cliquer sur l'un de ces deux boutons par la suite.

 void AddressBook::editContact()
 {
     oldName = nameLine->text();
     oldAddress = addressText->toPlainText();

     updateInterface(EditingMode);
 }

La méthode submitContact() a été divisée en deux avec un bloc if-else. On teste currentMode pour voir si le mode courant est AddingMode. Si c'est le cas, on procède à l'ajout.

 void AddressBook::submitContact()
 {
     ...
     if (currentMode == AddingMode) {

         if (!contacts.contains(name)) {
             contacts.insert(name, address);
             QMessageBox::information(this, tr("Add Successful"),
                 tr("\"%1\" has been added to your address book.").arg(name));
         } else {
             QMessageBox::information(this, tr("Add Unsuccessful"),
                 tr("Sorry, \"%1\" is already in your address book.").arg(name));
         }

Sinon, on s'assure que currentMode est en EditingMode. Si c'est le cas, on compare oldName et name. Si le nom a changé, on supprime l'ancien contact de contacts et on insère le contact mis a jour.

     } else if (currentMode == EditingMode) {

         if (oldName != name) {
             if (!contacts.contains(name)) {
                 QMessageBox::information(this, tr("Edit Successful"),
                     tr("\"%1\" has been edited in your address book.").arg(oldName));
                 contacts.remove(oldName);
                 contacts.insert(name, address);
             } else {
                 QMessageBox::information(this, tr("Edit Unsuccessful"),
                     tr("Sorry, \"%1\" is already in your address book.").arg(name));
             }
         } else if (oldAddress != address) {
             QMessageBox::information(this, tr("Edit Successful"),
                 tr("\"%1\" has been edited in your address book.").arg(name));
             contacts[name] = address;
         }
     }

     updateInterface(NavigationMode);
 }

Si seule l'adresse a changé (i.e. oldAddress n'est pas identique à address), on met à jour l'adresse du contact. Enfin on règle currentMode à NavigationMode. C'est une étape importante puisque c'est cela qui réactive tous les boutons désactivés.

Afin de retirer un contact du carnet d'adresses, on implémente la méthode removeContact(). Cette méthode vérifie que le contact est présent dans contacts.

 void AddressBook::removeContact()
 {
     QString name = nameLine->text();
     QString address = addressText->toPlainText();

     if (contacts.contains(name)) {

         int button = QMessageBox::question(this,
             tr("Confirm Remove"),
             tr("Are you sure you want to remove \"%1\"?").arg(name),
             QMessageBox::Yes | QMessageBox::No);

         if (button == QMessageBox::Yes) {

             previous();
             contacts.remove(name);

             QMessageBox::information(this, tr("Remove Successful"),
                 tr("\"%1\" has been removed from your address book.").arg(name));
         }
     }

     updateInterface(NavigationMode);
 }

Si c'est le cas, on affiche une boîte de dialogue QMessageBox, demandant confirmation de la suppression à l'utilisateur. Une fois la confirmation effectuée, on appelle previous(), afin de s'assurer que l'interface utilisateur affiche une autre entrée, et on supprime le contact en utilisant le méthode remove() de QMap. Dans un souci pratique, on informe l'utilisateur de la suppression par le biais d'une autre QMessageBox. Les deux boîtes de dialogue utilisées dans cette méthode sont représentées ci-dessous.

Mise à jour de l'Interface utilisateur

On a évoqué plus haut la méthode updateInterface() comme moyen d'activer et de désactiver les différents boutons de l'interface en fonction du mode. Cette méthode met à jour le mode courant selon l'argument mode qui lui est passé, en l'assignant à currentMode, avant de tester sa valeur.

Chacun des boutons est ensuite activé ou désactivé, en fonction du mode. Le code source pour les cas AddingMode et EditingMode est visible ci-dessous:

 void AddressBook::updateInterface(Mode mode)
 {
     currentMode = mode;

     switch (currentMode) {

     case AddingMode:
     case EditingMode:

         nameLine->setReadOnly(false);
         nameLine->setFocus(Qt::OtherFocusReason);
         addressText->setReadOnly(false);

         addButton->setEnabled(false);
         editButton->setEnabled(false);
         removeButton->setEnabled(false);

         nextButton->setEnabled(false);
         previousButton->setEnabled(false);

         submitButton->show();
         cancelButton->show();
         break;

Dans le cas de NavigationMode, en revanche, des tests conditionnels sont passés en paramètre de QPushButton::setEnabled(). Ceci permet de s'assurer que les boutons editButton et removeButton ne sont activés que s'il existe au moins un contact dans le carnet d'adresses; nextButton et previousButton ne sont activés que lorsqu'il existe plus d'un contact dans le carnet d'adresses.

     case NavigationMode:

         if (contacts.isEmpty()) {
             nameLine->clear();
             addressText->clear();
         }

         nameLine->setReadOnly(true);
         addressText->setReadOnly(true);
         addButton->setEnabled(true);

         int number = contacts.size();
         editButton->setEnabled(number >= 1);
         removeButton->setEnabled(number >= 1);
         nextButton->setEnabled(number > 1);
         previousButton->setEnabled(number >1 );

         submitButton->hide();
         cancelButton->hide();
         break;
     }
 }

En effectuant les opérations de réglage du mode et de mise à jour de l'interface utilisateur au sein de la même méthode, on est à l'abri de l'éventualité où l'interface utilisateur se "désynchronise" de l'état interne de l'application.

[Previous: Chapitre 3] [Sommaire] [Next: Chapitre 5]

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt 4.5
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
 
 
 
 
Partenaires

Hébergement Web