[Предыдущий: Адресная книга. Урок 6 - Загрузка и сохранение] [Содержание]
Адресная книга. Урок 7 - Дополнительные функции
Файлы:
Этот урок освещает несколько дополнительных функций, которые делают приложение адресной книги более удобной для повседневного использования.
Хотя наше приложение адресной книги полезно само по себе, оно будет полезнее если мы сможем обмениваться информацией контактов с другими приложениями. Формат vCard - это широко распространённый популярный формат файлов, который может быть использован для этих целей. В этом уроке мы расширим наш клиент приложения адресной книги с тем, чтобы сделать возможным экспорт в файлы vCard .vcf.
Определение класса AddressBook
Мы добавим объект QPushButton, exportButton, и соответствующий открытый слот, exportAsVCard(), в наш класс AddressBook в файле addressbook.h.
void exportAsVCard();
...
QPushButton *exportButton;
Реализация класса AddressBook
Внутри конструктора AddressBook мы соединяем сигнал exportButton'а - clicked() - с exportAsVCard(). Мы также добавляем эту кнопку к нашей компоновке buttonLayout1, ответственной за нашу правую панель кнопок.
В функции exportAsVCard() мы извлекаем имя контакта в name. Мы объявляем firstName, lastName и nameList. Далее, мы ищем индекс первого пробельного символа в name. Если он найден, то мы разбиваем имя контакта на firstName и lastName. Затем мы замещаем пробел символом подчеркивания("_"). Соответственно, если нет пробельных символов, мы предполагаем, что контакт содержит только имя.
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);
Как и с функцией saveToFile(), мы открываем диалог выбора файла чтобы позволить пользователю выбрать расположение файла. Используя выбранное имя файла мы создаем экземпляр класса QFile для записи в него.
Мы пытаемся открыть файл в режиме WriteOnly. Если этот процесс закончится неудачно, то мы выводим на экран QMessageBox чтобы проинформировать пользователя о проблеме и передаем управление обратно. В противном случае, мы передаем файл в качестве параметра в объект класса QTextStream, out. Аналогично QDataStream, класс QTextStream предоставляет функциональность для чтения и записи обычного текста в файлы. В результате, сформированный файл .vcf можно открыть для редактирования в текстовом редакторе.
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}
QTextStream out(&file);
Затем мы записываем в файл vCard тег BEGIN:VCARD, и следом за ним тег VERSION:2.1. Имя контакта записывается с помощью тега N:. Для тега FN:, который заполняется в свойстве "File as" vCard, мы имеем для проверки имеет ли контакт фамилию или нет. Если имеет, то мы используем детали для заполнения nameList. В противном случае, мы записываем только 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";
В продолжение записываем адрес контакта. Точки с запятой в адресе экранируются с помощью символа "\", символы новой строки заменяются точкой с запятой, а запятые заменяются пробелами. В заключение, мы записываем тег ADR;HOME:;, следующий за тегом address, а затем тег 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));
}
В заключение, выводим на экран QMessageBox чтобы проинформировать пользователя о том, что файл vCard успешно экспортирован.
vCard - торговая марка Консорциума интернет-почты.
[Предыдущий: Адресная книга. Урок 6 - Загрузка и сохранение] [Содержание]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|