Qt中rcc工具简介
Qt 自帶的開發工具集里有專門的 rcc 工具,用于將 *.qrc 里面描述的圖片、文檔等編譯成對應的源代碼文件 qrc_*.cpp 或者獨立的二進制資源文件 *.rcc。下面介紹 rcc 工具的兩種用途:
(1)生成獨立的二進制資源文件 *.rcc
對于太大的圖片、音頻、視頻等文件,不適合集成到目標程序內部,可以放到操作系統文件路徑,或者單獨編譯成外掛資源 *.rcc 。舉例來說,myresource.qrc 包含了很多圖片和視頻,沒法編譯成目標程序內嵌資源時,可以打開 Qt 命令行,進入 myresource.qrc 所在的文件夾,執行命令:
rcc -binary myresource.qrc -o myresource.rcc
rcc 會把 myresource.qrc 里面描述的所有圖片、視頻等文件,都壓縮打包,生成一個二進制的 myresource.rcc 文件,這個 myresource.rcc 包含了所有的資源,這樣程序發布時就不需要帶一堆亂七八糟的碎文件了,一個 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 添加編譯腳本,其編譯過程如下圖所示:
rcc 工具會解析 application.qrc 內的 XML 文本,找到需要添加的各種文件,默認情況下,rcc 工具會對這些文件做 ZIP 壓縮,然后將壓縮后的 ZIP 數據的每個字節轉換成比如 0x6f, 數值形式,所有文件壓縮后的數據對應一個 C++ 靜態數組 qt_resource_data[] ,并添加注冊、取消注冊、初始化、清除等函數和資源描述結構體,最終形成一個 qrc_application.cpp 文件。然后用編譯器編譯 qrc_application.cpp文件,得到 qrc_applicaotion.o ,鏈接到目標程序內部,就可以用 ":/images/copy.png" 等形式訪問程序內嵌資源了。
注意到剛才向 *.pro 文件里添加 qrc 資源描述文件使用的運算符是 +=? ,也就是說可以為應用程序添加多個 *.qrc 文件,如果涉及的圖片比較多,可以用多個 *.qrc 對圖片分類存放:
RESOURCES += buttons.qrc?
RESOURCES += backgrounds.qrc
使用多個 *.qrc 與使用一個 *.qrc 的方式是一樣的,虛擬文件路徑都類似 ":/buttons/ok.png" 、":/backgrounds/bgmain.png" 等,這里的 ok.png 放在項目文件夾的 buttons 子文件夾里,而 bgmain.png 是放在項目文件夾的 backgrounds 子文件夾里,因此兩個文件的路徑是不同的。
qmake 為內嵌資源添加的 rcc 編譯命令,類似下面這樣:
rcc -name application? application.qrc -o qrc_application.cpp
得到 qrc_application.cpp 源文件之后,剩下的編譯、鏈接就與普通 .cpp 文件一模一樣了。
qrc_application.cpp 文件中不僅有各種圖片、文檔對應的靜態數組,還有些結構體和函數,比如初始化和清除函數。
對于 rcc 命令,如果不加 -name application? 選項參數,那么在 qrc_application.cpp 里面生成的初始化和清除函數名為:
int QT_RCC_MANGLE_NAMESPACE(qInitResources)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)();
如果加了 -name application? 選項參數,那么資源的初始化和清除函數名變為:
int QT_RCC_MANGLE_NAMESPACE(qInitResources_application)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_application)();
QT_RCC_MANGLE_NAMESPACE() 這個宏其實沒什么用,僅用于提示作用。資源的初始化函數和清除函數會在資源加載和卸載時自動被調用。
應用程序的內嵌資源通常不需要手動初始化,但也有例外情況,比如在使用某些鏈接庫中的資源文件時,如果出現使用了正確的文件路徑 ":/images/copy.png" 卻找不到資源里圖片文件的情況,那么需要在使用該資源的類聲明里或者在 main 函數里打頭的位置加入一句手動初始化:
Q_INIT_RESOURCE(resources);
resources 是指 resources.qrc 的簡短名字形式,不需要擴展名。
總結
以上是生活随笔為你收集整理的Qt中rcc工具简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt中moc的作用
- 下一篇: linux 打印输出重定向的问题