[Previous: Chapitre 6]
[Sommaire]
Carnet d'adresse 7 - Fonctionnalit?s avanc?es
Файлы:
Ce chapitre couvre quelques fonctionnalit?s additionnelles qui feront de notre carnet d'adresses une application plus pratique pour une utilisation quotidienne.
Bien que notre application carnet d'adresses soit utile en tant que telle, il serait pratique de pouvoir ?changer les contacts avec d'autres applications. Le format vCard est un un format de fichier populaire pour ?changer ce type de donn?es. Dans ce chapitre, nous ?tendrons notre carnet d'adresses pour permettre d'exporter des contacts dans des fichiers vCard .vcf.
D?finition de la classe AddressBook
Nous ajoutons un objet QPushButton, exportButton, et un slot public correspondant, exportAsVCard(), ? notre classe AddressBook dans le fichier addressbook.h.
void exportAsVCard();
...
QPushButton *exportButton;
Impl?mentation de la classe AddressBook
Dans le constructeur de AddressBook, nous connectons le signal clicked() de exportButton au slot exportAsVCard(). Nous ajoutons aussi ce bouton ? buttonLayout1, le layout responsable du groupe de boutons sur la droite.
Dans la m?thode exportAsVCard(), nous commen?ons par extraire le nom du contact dans \n name. Nous d?clarons firstname, lastName et nameList. Ensuite, nous cherchons la position du premier espace blanc de name. Si il y a un espace, nous s?parons le nom du contact en firstName et lastName. Finalement, nous rempla?ons l'espace par un underscore ("_"). Si il n'y a pas d'espace, nous supposons que le contact ne comprend que le pr?nom.
void AddressBook::exportAsVCard()
{
QString name = nameLine->text();
QString address = addressText->toPlainText();
QString firstName;
QString lastName;
QStringList nameList;
int index = name.indexOf(" ");
if (index != -1) {
nameList = name.split(QRegExp("\\s+"), QString::SkipEmptyParts);
firstName = nameList.first();
lastName = nameList.last();
} else {
firstName = name;
lastName = "";
}
QString fileName = QFileDialog::getSaveFileName(this,
tr("Export Contact"), "",
tr("vCard Files (*.vcf);;All Files (*)"));
if (fileName.isEmpty())
return;
QFile file(fileName);
Comme pour la m?thode saveToFile(), nous ouvrons une bo?te de dialogue pour donner la possibilit? ? l'utilisateur de choisir un emplacement pour le fichier. Avec le nom de fichier choisi, nous cr?ons une instance de QFile pour y ?crire.
Nous essayons d'ouvrir le fichier en mode WriteOnly. Si cela ?choue, nous affichons un QMessageBox pour informer l'utilisateur ? propos de l'origine du probl?me et nous quittons la m?thode. Sinon, nous passons le fichier comme param?tre pour cr?er un objet QTextStream, out. De la m?me fa?on que QDataStream, la classe QTextStream fournit les fonctionnalit?s pour lire et ?crire des fichiers de texte. Gr?ce ? cel?, le fichier .vcf g?n?r? pourra ?tre ouvert et ?dit? ? l'aide d'un simple ?diteur de texte.
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QTextStream out(&file);
Nous ?crivons ensuite un fichier vCard avec la balise BEGIN:VCARD, suivit par VERSION:2.1. Le nom d'un contact est ?crit ? l'aide de la balise N:. Pour la balise FN:, qui remplit le titre du contact, nous devons v?rifier si le contact ? un nom de famille d?fini ou non. Si oui, nous utilions les d?tails de nameList pour remplir le champ, dans le cas contraire on ?crit uniquement le contenu de firstName.
out << "BEGIN:VCARD" << "\n";
out << "VERSION:2.1" << "\n";
out << "N:" << lastName << ";" << firstName << "\n";
if (!nameList.isEmpty())
out << "FN:" << nameList.join(" ") << "\n";
else
out << "FN:" << firstName << "\n";
Nous continuons en ?crivant l'adresse du contact. Les points-virgules dans l'adresse sont ?chapp?s ? l'aide de "\", les retours de ligne sont remplac?s par des points-virgules, et les vigules sont remplac?es par des espaces. Finalement nous ?crivons les balises ADR;HOME:; suivies par l'adresse et la balise END:VCARD.
address.replace(";", "\\;", Qt::CaseInsensitive);
address.replace("\n", ";", Qt::CaseInsensitive);
address.replace(",", " ", Qt::CaseInsensitive);
out << "ADR;HOME:;" << address << "\n";
out << "END:VCARD" << "\n";
QMessageBox::information(this, tr("Export Successful"),
tr("\"%1\" has been exported as a vCard.").arg(name));
}
? la fin de la m?thode, un QMessageBox est affich? pour informer l'utilisateur que la vCard a ?t? export?e avec succ?s.
vCard est une marque d?pos?e de Internet Mail Consortium.
[Previous: Chapitre 6]
[Sommaire]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|