2月 25, 2009

【翻譯】Address Book 7 - Additional Features

@
tutorials/addressbook/part7/addressbook.cpp
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 中開始。我們宣告了 firstNamelastNamenameList。接下來,我們尋找姓名第一個為空格的索引值。假如有一個空格,我們將聯絡人的姓名分割成 firstNamelastName。然後,我們以一個底線("_")來取代空白。或者,假如沒有空格,我們則假定聯絡人僅有名字(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 回覆:

張貼留言