|
Qt 自帶的開發(fā)工具集里有專門的 rcc 工具,用于將 *.qrc 里面描述的圖片、文檔等編譯成對應的源代碼文件 qrc_*.cpp 或者獨立的二進制資源文件 *.rcc。下面介紹 rcc 工具的兩種用途: (1)生成獨立的二進制資源文件 *.rcc 對于太大的圖片、音頻、視頻等文件,不適合集成到目標程序內部,可以放到操作系統(tǒng)文件路徑,或者單獨編譯成外掛資源 *.rcc 。舉例來說,myresource.qrc 包含了很多圖片和視頻,沒法編譯成目標程序內嵌資源時,可以打開 Qt 命令行,進入 myresource.qrc 所在的文件夾,執(zhí)行命令:
rcc -binary myresource.qrc -o myresource.rcc
rcc 會把 myresource.qrc 里面描述的所有圖片、視頻等文件,都壓縮打包,生成一個二進制的 myresource.rcc 文件,這個 myresource.rcc 包含了所有的資源,這樣程序發(fā)布時就不需要帶一堆亂七八糟的碎文件了,一個 myresource.rcc 搞定。那么代碼中如何使用 myresource.rcc 呢?需要在 main 函數開始的位置注冊這個獨立的二進制資源文件:
QResource::registerResource("/path/to/myresource.rcc");
然后也是使用之前類似的虛擬文件路徑,比如 ":/images/copy.png" 、":/images/cat.gif" 。二進制資源文件 *.rcc 是用于外掛的,其實應用程序里面更常見的是內嵌資源,接下來介紹內嵌使用方式。 (2)應用程序內嵌資源 如果希望一個資源描述文件 application.qrc 在程序編譯時內嵌到目標程序里,需要在 *.pro 文件里加一句話:
RESOURCES += application.qrc
qmake 會自動根據這句話,為 application.qrc 添加編譯腳本,其編譯過程如下圖所示:![]() 注意到剛才向 *.pro 文件里添加 qrc 資源描述文件使用的運算符是 += ,也就是說可以為應用程序添加多個 *.qrc 文件,如果涉及的圖片比較多,可以用多個 *.qrc 對圖片分類存放:
RESOURCES += buttons.qrc
使用多個 *.qrc 與使用一個 *.qrc 的方式是一樣的,虛擬文件路徑都類似 ":/buttons/ok.png" 、":/backgrounds/bgmain.png" 等,這里的 ok.png 放在項目文件夾的 buttons 子文件夾里,而 bgmain.png 是放在項目文件夾的 backgrounds 子文件夾里,因此兩個文件的路徑是不同的。RESOURCES += backgrounds.qrc qmake 為內嵌資源添加的 rcc 編譯命令,類似下面這樣:
rcc -name application application.qrc -o qrc_application.cpp
得到 qrc_application.cpp 源文件之后,剩下的編譯、鏈接就與普通 .cpp 文件一模一樣了。qrc_application.cpp 文件中不僅有各種圖片、文檔對應的靜態(tài)數組,還有些結構體和函數,比如初始化和清除函數。 對于 rcc 命令,如果不加 -name application 選項參數,那么在 qrc_application.cpp 里面生成的初始化和清除函數名為:
int QT_RCC_MANGLE_NAMESPACE(qInitResources)();
如果加了 -name application 選項參數,那么資源的初始化和清除函數名變?yōu)椋?/span>int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)();
int QT_RCC_MANGLE_NAMESPACE(qInitResources_application)();
QT_RCC_MANGLE_NAMESPACE() 這個宏其實沒什么用,僅用于提示作用。資源的初始化函數和清除函數會在資源加載和卸載時自動被調用。int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_application)(); 應用程序的內嵌資源通常不需要手動初始化,但也有例外情況,比如在使用某些鏈接庫中的資源文件時,如果出現使用了正確的文件路徑 ":/images/copy.png" 卻找不到資源里圖片文件的情況,那么需要在使用該資源的類聲明里或者在 main 函數里打頭的位置加入一句手動初始化:
Q_INIT_RESOURCE(resources);
resources 是指 resources.qrc 的簡短名字形式,不需要擴展名。
轉載自:https://lug.ustc.edu.cn/sites/qtguide/ 原作者:Winland(winland0704@126.com) |
|
|