.tutorials/addressbook/part7/addressbook.h
.tutorials/addressbook/part7/finddialog.cpp
.tutorials/addressbook/part7/finddialog.h
.tutorials/addressbook/part7/main.cpp
.tutorials/addressbook/part7/part7.pro
這一章涵蓋了一些使得 Address Book 程式更加方便於每天使用的附加功能。
雖然我們的 Address Book 程式已經相當有用了,但是假如我們可以與其他程式交流聯絡人將會更好。vCard 格式是一個可以被用在這種用途上的普遍檔案格式。在這一章,我們擴展我們的 Address Book 客戶端(client),以允許聯絡人被轉換成 vCard .vcf 檔。
Defining the AddressBook Class
我們在 addressbook.h 檔案中的 AddressBook 類別加入一個 QPushButton 物件:exportButton,以及一個對應的公開 slot:exportAsVCard()。
void exportAsVCard(); ... QPushButton *exportButton;
Implementing the AddressBook Class
在 AddressBook 建構子中,我們將 exportButton 的 clicked() signal 連接到 exportAsVCard()。我們也將這個按鈕加入到我們的 buttonLayout1 中,其負責管理右邊按鈕控制板的佈局。
在我們的 exportAsVCard() 函式,我們藉由取得聯絡人姓名到 name 中開始。我們宣告了 firstName、lastName 與 nameList。接下來,我們尋找姓名第一個為空格的索引值。假如有一個空格,我們將聯絡人的姓名分割成 firstName 與 lastName。然後,我們以一個底線("_")來取代空白。或者,假如沒有空格,我們則假定聯絡人僅有名字(first name)。
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);
然後我們將 BEGIN:VCARD 標籤,以及 VERSION:2.1 標簽寫入到 vCard 檔案裡。聯絡人的姓名與 N: 一同寫入。 對於填入 vCard "File as" 屬性的 FN: 標籤,我們必須去確認聯絡人是否有姓氏(last name)。假如有,我們使用 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";
我們繼續寫入聯絡人住址。住址中的分號(semicolon)利用 "\" 跳脫(escape)、換行被取代成分號、且逗號(comma)被取代成空格。最後,我們寫入 ADR;HOME:; 標籤以及住址,然後是 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 是一個 Internet Mail Consortium 的商標
來源:Address Book 7 - Additional Features
版本:4.4.3
0 回覆:
張貼留言