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 6 - Sauvegarde et chargement

Files:

Ce chapitre couvre les fonctionnalités de gestion des fichiers de Qt que l'on utilise pour écrire les procédures de sauvegarde et chargement pour l'application carnet d'adresses.

Bien que la navigation et la recherche de contacts soient des fonctionnalités importantes, notre carnet d'adresses ne sera pleinement utilisable qu'une fois que l'on pourra sauvegarder les contacts existants et les charger à nouveau par la suite. Qt fournit de nombreuses classes pour gérer les entrées et sorties, mais nous avons choisi de nous contenter d'une combinaison de deux classes simples à utiliser ensemble: QFile et QDataStream.

Un objet QFile représente un fichier sur le disque qui peut être lu, et dans lequel on peut écrire. QFile est une classe fille de la classe plus générique QIODevice, qui peut représenter différents types de périphériques.

Un objet QDataStream est utilisé pour sérialiser des données binaires dans le but de les passer à un QIODevice pour les récupérer dans le futur. Pour lire ou écrire dans un QIODevice, il suffit d'ouvrir le flux, avec le périphérique approprié en paramètre, et d'y lire ou écrire.

Définition de la classe AddressBook

On déclare deux slots publics, saveToFile() et loadFromFile(), ainsi que deux objets QPushButton, loadButton et saveButton.

     void saveToFile();
     void loadFromFile();
     ...
     QPushButton *loadButton;
     QPushButton *saveButton;

Implémentation de la classe AddressBook

Dans notre constructeur, on instancie loadButton et saveButton. Idéalement, l'interface serait plus conviviale avec des boutons affichant "Load contacts from a file" et "Save contacts to a file". Mais compte tenu de la dimension des autres boutons, on initialise les labels des boutons à Load... et Save.... Heureusement, Qt offre une façon simple d'ajouter des info-bulles avec setToolTip(), et nous l'exploitons de la façon suivante pour nos boutons:

     loadButton->setToolTip(tr("Load contacts from a file"));
     ...
     saveButton->setToolTip(tr("Save contacts to a file"));

Bien qu'on ne cite pas le code correspondant ici, nous ajoutons ces deux boutons au layout de droite, button1Layout, comme pour les fonctionnalités précédentes, et nous connectons leurs signaux clicked() à leurs slots respectifs.

Pour la sauvegarde, on commence par récupérer le nom de fichier fileName, en utilisant QFileDialog::getSaveFileName(). C'est une méthode pratique fournie par QFileDialog, qui ouvre une boîte de dialogue modale et permet à l'utilisateur d'entrer un nom de fichier ou de choisir un fichier .abk existant. Les fichiers .abk correspondent à l'extension choisie pour la sauvegarde des contacts de notre carnet d'adresses.

 void AddressBook::saveToFile()
 {
     QString fileName = QFileDialog::getSaveFileName(this,
         tr("Save Address Book"), "",
         tr("Address Book (*.abk);;All Files (*)"));

La boîte de dialogue affichée est visible sur la capture d'écran ci- dessous.

Si fileName n'est pas vide, on crée un objet QFile, file, à partir de fileName. QFile fonctionne avec QDataStream puisqu'il dérive de QIODevice.

Ensuite, on essaie d'ouvrir le fichier en écriture, ce qui correspond au mode WriteOnly. Si cela échoue, on en informe l'utilisateur avec une QMessageBox.

     if (fileName.isEmpty())
         return;
     else {
         QFile file(fileName);
         if (!file.open(QIODevice::WriteOnly)) {
             QMessageBox::information(this, tr("Unable to open file"),
                 file.errorString());
             return;
         }

Dans le cas contraire, on instancie un objet QDataStream, out, afin d'écrire dans le fichier ouvert. QDataStream nécessite que la même version de flux soit utilisée pour la lecture et l'écriture. On s'assure que c'est le cas en spécifiant explicitement d'utiliser la version introduite avec Qt 4.5 avant de sérialiser les données vers le fichier file.

         QDataStream out(&file);
         out.setVersion(QDataStream::Qt_4_5);
         out << contacts;
     }
 }

Pour le chargement, on récupère également fileName en utilisant QFileDialog::getOpenFileName(). Cette méthode est l'homologue de QFileDialog::getSaveFileName() et affiche également une boîte de dialogue modale permettant à l'utilisateur d'entrer un nom de fichier ou de selectionner un fichier .abk existant, afin de le charger dans le carnet d'adresses.

 void AddressBook::loadFromFile()
 {
     QString fileName = QFileDialog::getOpenFileName(this,
         tr("Open Address Book"), "",
         tr("Address Book (*.abk);;All Files (*)"));

Sous Windows, par exemple, cette méthode affiche une boîte de dialogue native pour la sélection de fichier, comme illustré sur la capture d'écran suivante:

Si fileName n'est pas vide, on utilise une fois de plus un objet QFile, file, et on tente de l'ouvrir en lecture, avec le mode ReadOnly. De même que précédemment dans notre implémentation de saveToFile(), si cette tentative s'avère infructueuse, on en informe l'utilisateur par le biais d'une QMessageBox.

     if (fileName.isEmpty())
         return;
     else {

         QFile file(fileName);

         if (!file.open(QIODevice::ReadOnly)) {
             QMessageBox::information(this, tr("Unable to open file"),
                 file.errorString());
             return;
         }

         QDataStream in(&file);
         in.setVersion(QDataStream::Qt_4_5);
         contacts.empty();   // empty existing contacts
         in >> contacts;

Dans le cas contraire, on instancie un objet QDataStream, in, en spécifiant la version à utiliser comme précédemment, et on lit les informations sérialisées vers la structure de données contacts. Notez qu'on purge contacts avant d'y mettre les informations lues afin de simplifier le processus de lecture de fichier. Une façon plus avancée de procéder serait de lire les contacts dans un objet QMap temporaire, et de copier uniquement les contacts n'existant pas encore dans contacts.

         if (contacts.isEmpty()) {
             QMessageBox::information(this, tr("No contacts in file"),
                 tr("The file you are attempting to open contains no contacts."));
         } else {
             QMap<QString, QString>::iterator i = contacts.begin();
             nameLine->setText(i.key());
             addressText->setText(i.value());
         }
     }

     updateInterface(NavigationMode);
 }

Pour afficher les contacts lus depuis le fichier, on doit d'abord valider les données obtenues afin de s'assurer que le fichier lu contient effectivement des entrées de carnet d'adresses. Si c'est le cas, on affiche le premier contact; sinon on informe l'utilisateur du problème par une QMessageBox. Enfin, on met à jour l'interface afin d'activer et de désactiver les boutons de façon appropriée.

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

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