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