[Previous: Chapitre 5]
[Sommaire]
[Next: Chapitre 7]
Carnet d'Adresses 6 - Sauvegarde et chargement
Файлы:
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();
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]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|