Qt 資源系統(Resource System)可以提供與平台無關的機制,讓您把應用程式的圖檔、語系檔、資料等儲存於可執行檔之中,避免相關的資源檔案遺失的問題,Qt資源系統是基於 qmake、rcc(resource compiler),並搭配QFile來使用,您必須在產生的.pro檔之中,告知資源群集檔(Resource Collection File)的位置與名稱。
資源群集檔的副檔名為.qrc,實際的內容為XML格式的檔案,當中告知了這個應用程式所要使用到的資源檔案,例如您想要將QListWidget 與 QListWidgetItem 中所使用到的圖檔儲存在可執行檔案之中,則可以撰寫一個resourcefile.qrc:
- resourcefile.qrc
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/bee_head.jpg</file>
<file>images/bush_head.jpg</file>
<file>images/cat_head.jpg</file>
<file>images/caterpillar_head.jpg</file>
<file>images/momor_head.jpg</file>
</qresource>
</RCC>
檔案的路徑是相對於.qrc檔案的位置。接著您要在產生的.pro檔案中,增加一行,告知.qrc檔案的位置,例如:
RESOURCES = resourcefile.qrc
qmake會產生出製造qrc_resourcefile.cpp的規則,之後使用rcc產生.cpp檔案,當中會將想要嵌入的相關檔案,壓縮並轉換為代表二進位資料的C++靜態無號字元陣列,如果您的.qrc檔案內容有變動,在編譯時.cpp檔案也會重新產生。
如果要使用嵌入的資源,則要在路徑的前端放置:/,例如:
QListWidget *listWidget = new QListWidget;
listWidget->insertItem(0, new QListWidgetItem(
QIcon(":/images/caterpillar_head.jpg"), "caterpillar"));
listWidget->insertItem(1, new QListWidgetItem(
QIcon(":/images/momor_head.jpg"), "momor"));
listWidget->insertItem(2, new QListWidgetItem(
QIcon(":/images/bush_head.jpg"), "bush"));
listWidget->insertItem(3, new QListWidgetItem(
QIcon(":/images/bee_head.jpg"), "bee"));
listWidget->insertItem(4, new QListWidgetItem(
QIcon(":/images/cat_head.jpg"), "cat"));
listWidget->insertItem(0, new QListWidgetItem(
QIcon(":/images/caterpillar_head.jpg"), "caterpillar"));
listWidget->insertItem(1, new QListWidgetItem(
QIcon(":/images/momor_head.jpg"), "momor"));
listWidget->insertItem(2, new QListWidgetItem(
QIcon(":/images/bush_head.jpg"), "bush"));
listWidget->insertItem(3, new QListWidgetItem(
QIcon(":/images/bee_head.jpg"), "bee"));
listWidget->insertItem(4, new QListWidgetItem(
QIcon(":/images/cat_head.jpg"), "cat"));
您也可以為資源檔案的路徑設置別名(Alias),例如:
<file alias="caterpillar_head.jpg">images/caterpillar_head.jpg</file>
之後在程式中指定路徑時,就可以直接使用別名,例如:
listWidget->insertItem(0, new QListWidgetItem(
QIcon(":/caterpillar_head.jpg"), "caterpillar"));
QIcon(":/caterpillar_head.jpg"), "caterpillar"));
您也可以為別名設置前置(Prefix),例如:
<qresource prefix="/resources">
<file alias="caterpillar_head.jpg">images/caterpillar_head.jpg</file>
</qresource>
<file alias="caterpillar_head.jpg">images/caterpillar_head.jpg</file>
</qresource>
之後每個別名都會自動加上前置,使用時如下:
listWidget->insertItem(0, new QListWidgetItem(
QIcon(":/resources/caterpillar_head.jpg"), "caterpillar"));
QIcon(":/resources/caterpillar_head.jpg"), "caterpillar"));
您也可以搭配語系來使用嵌入的資源檔,例如若這麼設定:
<qresource>
<file>caterpillar_head.jpg</file>
</qresource>
<qresource lang="zh_TW">
<file alias="caterpillar_head.jpg">caterpillar_head_zh_TW.jpg</file>
</qresource>
<file>caterpillar_head.jpg</file>
</qresource>
<qresource lang="zh_TW">
<file alias="caterpillar_head.jpg">caterpillar_head_zh_TW.jpg</file>
</qresource>
當路徑指定為:/caterpillar_head.jpg,如果使用者是使用zh_TW語系,則會自動對應使用caterpillar_head_zh_TW.jpg,此一方法也可以用來載入.qm檔案,以實現多國語系支援,可參考 翻譯應用程式 與 多國語系選擇與切換。