Qt 資源系統

pamxy發表於2013-03-29

轉自:http://blog.sina.com.cn/s/blog_98a4dde701013lcw.html

Qt 資源系統是一個將二進位制檔案存入可執行程式的平臺無關的機制。當你的程式經常需要這樣的一系列檔案(圖示、翻譯檔案等)並且不想冒丟失某些檔案的風險時非常有用。資源系統基於 qmakercc和 QFile 之間的緊密合作。它廢棄了 Qt 3的嵌入工具和 image collection 機制。

目錄

[隱藏]

資源集合檔案( .qrc )

程式相關的資源在一個 .qrc 檔案中指明,其基於XML的檔案格式列出磁碟上的檔案,並且可選擇地指明在程式中訪問對應的資源所使用的名稱。

下面是一個 .qrc 檔案的例子:

<!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/copy.png</file><file>images/cut.png</file> <file>images/new.png</file> <file>images/open.png</file><file>images/paste.png</file> <file>images/save.png</file> </qresource> </RCC>

.qrc 檔案中列出的資原始檔是程式的程式碼樹的一部分。其中指明的路徑是對於 .qrc 檔案所在目錄的相對路徑。注:列出的資原始檔必須位於 .qrc 檔案所在目錄或其子目錄。

資源資料或者可以編譯成二進位制進而在程式程式碼中立即訪問,或者可以編譯成可以被建立的二進位制資源以便稍後在程式程式碼中登記到資源系統。

預設情況下,程式可以直接使用 ":/" 字首加與程式碼樹中相同的名字訪問資源。例如,:/images/cut.png 可以訪問在程式程式碼樹中位置為 images/cut.png 的 cut.png 檔案。用檔案標籤的別名屬性可以改變訪問名稱:

<file alias="cut-img.png">images/cut.png</file>

之後就可以在程式中使用 :/cut-img.png 訪問此檔案了。還可以使用 qresource 標籤的字首屬性為 .qrc 檔案中列出的所有檔案指明路徑字首:

<qresource prefix="/myresources"> <file alias="cut-img.png">images/cut.png</file></qresource>

於是可以用 :/myresources/cut-img.png 訪問該檔案了。

有些類似於翻譯檔案和圖示的資源可能需要隨著使用者的本地配置而改變,可以通過為 qresource 標籤指明 lang 屬性和適當的本地化字串來完成。例如:

<qresource> <file>cut.jpg</file> </qresource> <qresource lang="fr"> <filealias="cut.jpg">cut_fr.jpg</file> </qresource>

如果使用者的本地配置是法語(也即 QLocale::system().name() 返回 "fr_FR" ),:/cut.jpg 就變成了對 cut_fr.jpg 檔案的引用。如果是別的本地配置,仍然使用 cut.jpg 。

使用本地化字串的格式的說明可以參考 QLocale 文件。

外部二進位制資源

要建立外部二進位制資源,必須通過傳遞 -binary 開關給 rcc 來建立資源資料(通常使用 .rcc 副檔名),在建立之後就可以使用 QResource API 登記該資源。

例如, .qrc 檔案中指明的一系列資源資料可以用下面的方法編譯:

rcc -binary myresource.qrc -o myresource.rcc

在程式裡,需要用以下程式碼登記該資源:

QResource::registerResource("/path/to/myresource.rcc");

編譯嵌入資源

如果需要把資源編譯嵌入到二進位制檔案中, .qrc 檔案必須在 .pro 檔案中寫明以便於 qmake 可以正確處理。例如:

RESOURCES = application.qrc

qmake 會產生 make 規則來生成一個連結到程式中的名為 qrc_application.cpp 的檔案。這個檔案以靜態的 C++ 壓縮二進位制陣列包含了所有圖片和其他資源的資料。每當 qrc_application.cpp 本身或者是其中引用的資原始檔發生改變後,該檔案都會被自動重新生成。如果你不使用 .pro 檔案,那麼可以手工呼叫 rcc 或者在 build 系統中新增 build 規則。

檔案:Resources.png

當前,哪怕是在 Windows and Mac OS X 這些原生支援資源機制的作業系統中,Qt 也總是把資源資料儲存在可執行檔案中。在將來的 Qt 發行版本中可能會有所改變。

在程式中使用資源

在程式中,多數情況下可以使用資源路徑代替對應的正常的普通檔案路徑。特別地,可以用資源路徑取代檔名傳遞給 QIcon、 QImage ,或者 QPixmap 的建構函式:

cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t")this);

關於在實際應用程式中使用 Qt 資源系統來儲存圖示,可以參考 Application 例子.

在記憶體中,以一顆資源物件樹來組織資源。此樹在程式啟動時被自動生成並且被 QFile 用來定位資源路徑。你可以使用帶有 ":/" 字首的 QDir 從根目錄開始遍歷這棵樹。

Qt 資源系統支援搜尋路徑列表。如果你用 ":" 代替 ":/" 作為字首,則會使用搜尋路徑列表來搜尋資源。程式啟動時搜尋路徑列表為空,可以用 QDir::addSearchPath() 在其中增加路徑。

如果有資源位於靜態庫中,需要用不帶有字尾的 .qrc 檔名為引數呼叫 Q_INIT_RESOURCE() 來強制初始化資源系統。例如:

int main(int argc, char *argv[]) { QApplication app(argc, argv);Q_INIT_RESOURCE(graphlib); ... return app.exec(); }

類似地,如果你需要顯式地解除安裝一系列資源(比如外掛被解除安裝或資源不再有效),你可以用同前的檔名為引數呼叫 Q_CLEANUP_RESOURCE() ,來強制解除安裝資源。


相關文章