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  · 

Address Book 6 - Loading and Saving

Files:

This chapter covers the file handling features of Qt that we use to write loading and saving routines for the address book application.

Although browsing and searching for contacts are useful features, our address book is not ready for use until we can save existing contacts and load them again at a later time.

Qt provides a number of classes for input and output, but we have chosen to use two which are simple to use in combination: QFile and QDataStream.

A QFile object represents a file on disk that can be read from and written to. QFile is a subclass of the more general QIODevice class which represents many different kinds of devices.

A QDataStream object is used to serialize binary data so that it can be stored in a QIODevice and retrieved again later. Reading from a QIODevice and writing to it is as simple as opening the stream - with the respective device as a parameter - and reading from or writing to it.

Defining the AddressBook Class

We declare two public slots, saveToFile() and loadFromFile(), as well as two QPushButton objects, loadButton and saveButton.

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

Implementing the AddressBook Class

In our constructor, we instantiate loadButton and saveButton. Ideally, it would be more user-friendly to set the push buttons' labels to "Load contacts from a file" and "Save contacts to a file". However, due to the size of our other push buttons, we set the labels to Load... and Save.... Fortunately, Qt provides a simple way to set tooltips with setToolTip() and we use it in the following way for our push buttons:

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

Although it is not shown here, just like the other features we implemented, we add the push buttons to the layout panel on the right, button1Layout, and we connect the push buttons' clicked() signals to their respective slots.

For the saving feature, we first obtain fileName using QFileDialog::getSaveFileName(). This is a convenience function provided by QFileDialog, which pops up a modal file dialog and allows the user to enter a file name or select any existing .abk file. The .abk file is our Address Book extension that we create when we save contacts.

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

The file dialog that pops up is displayed in the screenshot below:

If fileName is not empty, we create a QFile object, file, with fileName. QFile works with QDataStream as QFile is a QIODevice.

Next, we attempt to open the file in WriteOnly mode. If this is unsuccessful, we display a QMessageBox to inform the user.

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

Otherwise, we instantiate a QDataStream object, out, to write the open file. QDataStream requires that the same version of the stream is used for reading and writing. We ensure that this is the case by setting the version used to the version introduced with Qt 4.5 before serializing the data to file.

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

For the loading feature, we also obtain fileName using QFileDialog::getOpenFileName(). This function, the counterpart to QFileDialog::getSaveFileName(), also pops up the modal file dialog and allows the user to enter a file name or select any existing .abk file to load it into the address book.

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

On Windows, for example, this function pops up a native file dialog, as shown in the following screenshot.

If fileName is not empty, again, we use a QFile object, file, and attempt to open it in ReadOnly mode. Similar to our implementation of saveToFile(), if this attempt is unsuccessful, we display a QMessageBox to inform the user.

     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;

Otherwise, we instantiate a QDataStream object, in, set its version as above and read the serialized data into the contacts data structure. The contacts object is emptied before data is read into it to simplify the file reading process. A more advanced method would be to read the contacts into a temporary QMap object, and copy over non-duplicate contacts into 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);
 }

To display the contacts that have been read from the file, we must first validate the data obtained to ensure that the file we read from actually contains address book contacts. If it does, we display the first contact; otherwise, we display a QMessageBox to inform the user about the problem. Lastly, we update the interface to enable and disable the push buttons accordingly.

[Previous: Address Book 5 - Adding a Find Function] [Contents] [Next: Chapter 7]

Publicité

Best Of

Actualités les plus lues

Semaine
Mois
Année
  1. Les développeurs détestent-ils les antivirus ? Un programmeur manifeste sa haine envers ces solutions de sécurité 23
  2. «Le projet de loi des droits du développeur» : quelles conditions doivent remplir les entreprises pour que le développeur puisse réussir ? 45
  3. Une nouvelle ère d'IHM 3D pour les automobiles, un concept proposé par Digia et implémenté avec Qt 3
  4. Qt Creator 2.5 est sorti en beta, l'EDI supporte maintenant plus de fonctionnalités de C++11 2
  5. PySide devient un add-on Qt et rejoint le Qt Project et le modèle d'open gouvernance 1
  6. Vingt sociétés montrent leurs décodeurs basés sur Qt au IPTV World Forum, en en exploitant diverses facettes (déclaratif, Web, widgets) 0
  7. Thread travailleur avec Qt en utilisant les signaux et les slots, un article de Christophe Dumez traduit par Thibaut Cuvelier 1
  1. « Quelque chose ne va vraiment pas avec les développeurs "modernes" », un développeur à "l'ancienne" critique la multiplication des bibliothèques 94
  2. Apercevoir la troisième dimension ou l'utilisation multithreadée d'OpenGL dans Qt, un article des Qt Quarterly traduit par Guillaume Belz 0
  3. Pourquoi les programmeurs sont-ils moins payés que les gestionnaires de programmes ? Manquent-ils de pouvoir de négociation ? 50
  4. Les développeurs détestent-ils les antivirus ? Un programmeur manifeste sa haine envers ces solutions de sécurité 23
  5. «Le projet de loi des droits du développeur» : quelles conditions doivent remplir les entreprises pour que le développeur puisse réussir ? 45
  6. Quelles nouveautés de C++11 Visual C++ doit-il rapidement intégrer ? Donnez-nous votre avis 10
  7. Qt Commercial : Digia organise un webinar gratuit le 27 mars sur la conception d'interfaces utilisateur et d'applications avec le framework 0
Page suivante

Le blog Digia au hasard

Logo

Déploiement d'applications Qt Commercial sur les tablettes Windows 8

Le blog Digia est l'endroit privilégié pour la communication sur l'édition commerciale de Qt, où des réponses publiques sont apportées aux questions les plus posées au support. Lire l'article.

Communauté

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

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.6-snapshot
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