小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Qt中rcc工具簡介

 torony 2017-08-04
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 添加編譯腳本,其編譯過程如下圖所示:
rcc
rcc 工具會解析 application.qrc 內的 XML 文本,找到需要添加的各種文件,默認情況下,rcc 工具會對這些文件做 ZIP 壓縮,然后將壓縮后的 ZIP 數據的每個字節(jié)轉換成比如 0x6f, 數值形式,所有文件壓縮后的數據對應一個 C++ 靜態(tài)數組 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 文件中不僅有各種圖片、文檔對應的靜態(tài)數組,還有些結構體和函數,比如初始化和清除函數。
對于 rcc 命令,如果不加 -name application  選項參數,那么在 qrc_application.cpp 里面生成的初始化和清除函數名為:
int QT_RCC_MANGLE_NAMESPACE(qInitResources)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)();
如果加了 -name application  選項參數,那么資源的初始化和清除函數名變?yōu)椋?/span>
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 的簡短名字形式,不需要擴展名。


轉載自:https://lug.ustc.edu.cn/sites/qtguide/

原作者:Winland(winland0704@126.com)

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多