一、資源系統
Qt的資源系統是一種獨立于平臺的機制,目的是用于在應用程序的可執行文件中存儲二進制文件。資源系統基于qmake、Qt的資源編譯器(rcc)和QFile實現。如果應用程序總是需要一組特定的文件(例如圖標、翻譯文件等),并且不想讓這些文件丟失而影響應用程序的功能,這時候則可以使用Qt資源系統解決這個問題。
二、外部二進制文件
Qt對于外部的二進制文件,如果需要使用這個二進制文件,那么則必須將所需要使用的二進制文件轉換成Qt的資源數據文件(默認文件名后綴為.rcc)。轉換步驟如下:
在Windows命令行下(這里以Windows系統為例),輸入以下命令:
備注:這里windows命令行工作區目錄需要切換到.qrc文件所在的文件夾下,如上,筆者的工程項目的.qrc文件位于上述文件路徑。然后再輸入上述命令,便可使用rcc工具生成對應的資源文件。如下圖:
上圖所示目錄下的rc.rcc則是生成的資源文件。資源文件生成完成后,如何在應用程序中使用呢?
(1)在應用程序中使用registerResource()注冊資源,如下代碼:
#include"widget.h" #include#include #include intmain(intargc,char*argv[]) { QApplicationa(argc,argv); //資源文件的路徑 QStringrccPath="C:/Users/iriczhao/Documents/untitled6/rc.rcc"; //注冊資源文件 if(!QResource::registerResource(rccPath)) { qDebug()<<"rcc?register?failed!"; ????} ????Widget?w; ????w.show(); ???? ????return?a.exec(); }
(2)默認情況下,在應用程序中,可以使用與資源樹中相同的文件名訪問資源,使用 :/ 前綴,或者使用qrc模式的URL訪問資源。例如,文件路徑:/images/top_bk.png或URL qrc:///images/top_bk.png將提供對top_bk.png文件的訪問,該文件在應用程序資源樹中的位置是images/top_bk.png。
如果不需要資源文件了,可以使用unregisterResource()卸載注冊的資源。
本小節描述的資源文件使用方法是:rcc+QResource。這種方式在發布應用軟件時需要連資源文件一起發布,并且需要保證資源的路徑與應用程序中設置的一致。除了這種方式,還可以將資源與應用程序編譯成二進制文件,后文會繼續寫到。
在內存中,資源由資源對象樹表示,該樹在啟動時自動構建,并由QFile解析資源的路徑。我們可以使用:/初始化的QDir從資源樹根開始地方進行資源導航和搜索。Qt的資源系統支持搜索路徑列表,如果使用:而不是:/作為前綴引用資源,則將使用搜索路徑列表查找該資源。搜索路徑列表在啟動時為空;需要調用QDir::addSearchPath()添加資源搜索路徑。
三、將資源與應用程序編譯成二進制文件
方法如下:
在工程文件.pro中,新增RESOURCES變量,如下:
RESOURCES=application.qrc
application.qrc為資源描述文件。還可以通過QtCreator的資源創建對話框添加。
這樣在應用程序構建中,資源文件將會與應用程序一起構建成統一的整體,如下圖所示:
通過這種方式,Qt總是將資源數據與應用程序編譯構建在一起。這樣就不必擔心丟失資源的問題,但是會為需要編譯的資源開設內存空間,對硬件資源嚴苛的環境并不友好。
四、使用庫中的資源
如果資源在庫中,若需要使用庫中資源,則需要調用Q_INIT_RESOURCE()強制初始化資源,將.qrc文件的資源名傳入到Q_INIT_RESOURCE()中。例如:
MyClass::MyClass():BaseClass(){ Q_INIT_RESOURCE(resources);//強制初始化資源 QFilefile(":/myfile.dat"); ... }
這種方式確保了在靜態鏈接的情況下,資源被鏈接到最終的應用程序二進制文件中。在實際開發中,應該將初始化代碼放在庫中使用資源的位置附近,這樣,如果基于庫的應用程序使用了依賴于它們的庫的特性,那么它們將只鏈接這些資源。
注意:由于rcc生成的資源初始化器是在全局名稱空間中聲明的,所以對Q_INIT_RESOURCE()的調用也需要在名稱空間之外進行。
如果庫包含的資源不是內部使用的,而是公開給庫的應用程序端,則需要在應用程序代碼中進行初始化。例如:
intmain(intargc,char*argv[]){ QApplicationapp(argc,argv); Q_INIT_RESOURCE(graphlib); QFilefile(":/graph.png"); ... returnapp.exec(); }
這可以確保在靜態鏈接的情況下將資源鏈接到最終的應用程序二進制文件中,但在動態鏈接的情況下(如插件)也會觸發庫加載。
同樣,如果必須顯式卸載一組資源,可以調用Q_CLEANUP_RESOURCE()來強制刪除資源,傳入的參數是.qrc資源文件名稱。
注意:當資源作為應用程序的一部分構建時,Q_INIT_RESOURCE()和Q_CLEANUP_RESOURCE()是不必要的。
五、資源壓縮
Qt資源壓縮是指:利用Qt的資源編譯器(rcc)對資源文件(.qrc)中提到的資源進行壓縮處理,以此方式優化最終二進制文件占用磁盤空間的情況 。默認情況下,它將執行自發式檢查,以確定壓縮是否值得,如果壓縮不夠,它將存儲未壓縮的內容。Qt資源文件的壓縮有如下特點:
(1)可以設置壓縮的壓縮閾值(threshold)。
(2)可以打開或關閉壓縮功能。
(3)可以設置壓縮等級。
(4)rcc支持以下壓縮算法和壓縮等級:
序號 | 壓縮方式 | 描述 |
---|---|---|
1 | zstd | 使用Zstandard庫來壓縮內容。有效的壓縮級別范圍從1到19,1是最小的壓縮(耗費最少的CPU時間),19是最大的壓縮(耗費最多的CPU時間)。默認級別為14。特殊值0告訴zstd庫選擇一個實現定義的默認值。 |
2 | zlib | 使用zlib庫壓縮內容。有效的壓縮級別范圍從1到9,1是應用最少的壓縮(耗費最少的CPU時間),9是應用最多的壓縮(耗費最多的CPU時間)。特殊值0表示“不壓縮”,實際開發中不應使用。默認通常是級別6。 |
3 | none | 沒有壓縮。與-no-compress選項相同。 |
六、總結
總而言之,Qt框架對應用程序的資源有兩種使用、控制方式:
(1)第一種是直接將資源(如圖片、圖表)等與應用程序一起構建編譯,通過這種方式,資源數據將會與應用程序成為整體,不用擔心資源數據的丟失問題,但是對于內存資源嚴苛的環境并不友好。
(2)第二種是通過QResource類API動態的注冊和卸載資源數據文件(也稱為動態資源引入)。這樣在程序的運行中能動態的加載、引入資源數據,便于資源數據的管理和使用,同時也縮小了應用程序的內存占用空間。在Qt框架中,使用的外部資源文件(二進制)必須是.rcc文件。這種文件需要使用Qt資源編譯器(RCC)工具進行編譯、處理、生成,然后使用QResource類進行.rcc文件的注冊和卸載操作,動態的在應用程序運行過程中使用資源文件。
-
WINDOWS
+關注
關注
3文章
3541瀏覽量
88626 -
編譯器
+關注
關注
1文章
1623瀏覽量
49108 -
Qt
+關注
關注
1文章
302瀏覽量
37899 -
資源系統
+關注
關注
0文章
2瀏覽量
5283 -
命令行
+關注
關注
0文章
77瀏覽量
10387
原文標題:Qt資源系統,再也不用擔心按鈕圖標不見了
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論