一、資源系統(tǒng)
Qt的資源系統(tǒng)是一種獨(dú)立于平臺(tái)的機(jī)制,目的是用于在應(yīng)用程序的可執(zhí)行文件中存儲(chǔ)二進(jìn)制文件。資源系統(tǒng)基于qmake、Qt的資源編譯器(rcc)和QFile實(shí)現(xiàn)。如果應(yīng)用程序總是需要一組特定的文件(例如圖標(biāo)、翻譯文件等),并且不想讓這些文件丟失而影響應(yīng)用程序的功能,這時(shí)候則可以使用Qt資源系統(tǒng)解決這個(gè)問(wèn)題。
二、外部二進(jìn)制文件
Qt對(duì)于外部的二進(jìn)制文件,如果需要使用這個(gè)二進(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工具生成對(duì)應(yīng)的資源文件。如下圖:
上圖所示目錄下的rc.rcc則是生成的資源文件。資源文件生成完成后,如何在應(yīng)用程序中使用呢?
(1)在應(yīng)用程序中使用registerResource()注冊(cè)資源,如下代碼:
#include"widget.h" #include#include #include intmain(intargc,char*argv[]) { QApplicationa(argc,argv); //資源文件的路徑 QStringrccPath="C:/Users/iriczhao/Documents/untitled6/rc.rcc"; //注冊(cè)資源文件 if(!QResource::registerResource(rccPath)) { qDebug()<<"rcc?register?failed!"; ????} ????Widget?w; ????w.show(); ???? ????return?a.exec(); }
(2)默認(rèn)情況下,在應(yīng)用程序中,可以使用與資源樹(shù)中相同的文件名訪問(wèn)資源,使用 :/ 前綴,或者使用qrc模式的URL訪問(wèn)資源。例如,文件路徑:/images/top_bk.png或URL qrc:///images/top_bk.png將提供對(duì)top_bk.png文件的訪問(wèn),該文件在應(yīng)用程序資源樹(shù)中的位置是images/top_bk.png。
如果不需要資源文件了,可以使用unregisterResource()卸載注冊(cè)的資源。
本小節(jié)描述的資源文件使用方法是:rcc+QResource。這種方式在發(fā)布應(yīng)用軟件時(shí)需要連資源文件一起發(fā)布,并且需要保證資源的路徑與應(yīng)用程序中設(shè)置的一致。除了這種方式,還可以將資源與應(yīng)用程序編譯成二進(jìn)制文件,后文會(huì)繼續(xù)寫(xiě)到。
在內(nèi)存中,資源由資源對(duì)象樹(shù)表示,該樹(shù)在啟動(dòng)時(shí)自動(dòng)構(gòu)建,并由QFile解析資源的路徑。我們可以使用:/初始化的QDir從資源樹(shù)根開(kāi)始地方進(jìn)行資源導(dǎo)航和搜索。Qt的資源系統(tǒng)支持搜索路徑列表,如果使用:而不是:/作為前綴引用資源,則將使用搜索路徑列表查找該資源。搜索路徑列表在啟動(dòng)時(shí)為空;需要調(diào)用QDir::addSearchPath()添加資源搜索路徑。
三、將資源與應(yīng)用程序編譯成二進(jìn)制文件
方法如下:
在工程文件.pro中,新增RESOURCES變量,如下:
RESOURCES=application.qrc
application.qrc為資源描述文件。還可以通過(guò)QtCreator的資源創(chuàng)建對(duì)話(huà)框添加。
這樣在應(yīng)用程序構(gòu)建中,資源文件將會(huì)與應(yīng)用程序一起構(gòu)建成統(tǒng)一的整體,如下圖所示:
通過(guò)這種方式,Qt總是將資源數(shù)據(jù)與應(yīng)用程序編譯構(gòu)建在一起。這樣就不必?fù)?dān)心丟失資源的問(wèn)題,但是會(huì)為需要編譯的資源開(kāi)設(shè)內(nèi)存空間,對(duì)硬件資源嚴(yán)苛的環(huán)境并不友好。
四、使用庫(kù)中的資源
如果資源在庫(kù)中,若需要使用庫(kù)中資源,則需要調(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í)際開(kāi)發(fā)中,應(yīng)該將初始化代碼放在庫(kù)中使用資源的位置附近,這樣,如果基于庫(kù)的應(yīng)用程序使用了依賴(lài)于它們的庫(kù)的特性,那么它們將只鏈接這些資源。
注意:由于rcc生成的資源初始化器是在全局名稱(chēng)空間中聲明的,所以對(duì)Q_INIT_RESOURCE()的調(diào)用也需要在名稱(chēng)空間之外進(jìn)行。
如果庫(kù)包含的資源不是內(nèi)部使用的,而是公開(kāi)給庫(kù)的應(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)制文件中,但在動(dòng)態(tài)鏈接的情況下(如插件)也會(huì)觸發(fā)庫(kù)加載。
同樣,如果必須顯式卸載一組資源,可以調(diào)用Q_CLEANUP_RESOURCE()來(lái)強(qiáng)制刪除資源,傳入的參數(shù)是.qrc資源文件名稱(chēng)。
注意:當(dāng)資源作為應(yīng)用程序的一部分構(gòu)建時(shí),Q_INIT_RESOURCE()和Q_CLEANUP_RESOURCE()是不必要的。
五、資源壓縮
Qt資源壓縮是指:利用Qt的資源編譯器(rcc)對(duì)資源文件(.qrc)中提到的資源進(jìn)行壓縮處理,以此方式優(yōu)化最終二進(jìn)制文件占用磁盤(pán)空間的情況 。默認(rèn)情況下,它將執(zhí)行自發(fā)式檢查,以確定壓縮是否值得,如果壓縮不夠,它將存儲(chǔ)未壓縮的內(nèi)容。Qt資源文件的壓縮有如下特點(diǎn):
(1)可以設(shè)置壓縮的壓縮閾值(threshold)。
(2)可以打開(kāi)或關(guān)閉壓縮功能。
(3)可以設(shè)置壓縮等級(jí)。
(4)rcc支持以下壓縮算法和壓縮等級(jí):
序號(hào) | 壓縮方式 | 描述 |
---|---|---|
1 | zstd | 使用Zstandard庫(kù)來(lái)壓縮內(nèi)容。有效的壓縮級(jí)別范圍從1到19,1是最小的壓縮(耗費(fèi)最少的CPU時(shí)間),19是最大的壓縮(耗費(fèi)最多的CPU時(shí)間)。默認(rèn)級(jí)別為14。特殊值0告訴zstd庫(kù)選擇一個(gè)實(shí)現(xiàn)定義的默認(rèn)值。 |
2 | zlib | 使用zlib庫(kù)壓縮內(nèi)容。有效的壓縮級(jí)別范圍從1到9,1是應(yīng)用最少的壓縮(耗費(fèi)最少的CPU時(shí)間),9是應(yīng)用最多的壓縮(耗費(fèi)最多的CPU時(shí)間)。特殊值0表示“不壓縮”,實(shí)際開(kāi)發(fā)中不應(yīng)使用。默認(rèn)通常是級(jí)別6。 |
3 | none | 沒(méi)有壓縮。與-no-compress選項(xiàng)相同。 |
六、總結(jié)
總而言之,Qt框架對(duì)應(yīng)用程序的資源有兩種使用、控制方式:
(1)第一種是直接將資源(如圖片、圖表)等與應(yīng)用程序一起構(gòu)建編譯,通過(guò)這種方式,資源數(shù)據(jù)將會(huì)與應(yīng)用程序成為整體,不用擔(dān)心資源數(shù)據(jù)的丟失問(wèn)題,但是對(duì)于內(nèi)存資源嚴(yán)苛的環(huán)境并不友好。
(2)第二種是通過(guò)QResource類(lèi)API動(dòng)態(tài)的注冊(cè)和卸載資源數(shù)據(jù)文件(也稱(chēng)為動(dòng)態(tài)資源引入)。這樣在程序的運(yùn)行中能動(dòng)態(tài)的加載、引入資源數(shù)據(jù),便于資源數(shù)據(jù)的管理和使用,同時(shí)也縮小了應(yīng)用程序的內(nèi)存占用空間。在Qt框架中,使用的外部資源文件(二進(jìn)制)必須是.rcc文件。這種文件需要使用Qt資源編譯器(RCC)工具進(jìn)行編譯、處理、生成,然后使用QResource類(lèi)進(jìn)行.rcc文件的注冊(cè)和卸載操作,動(dòng)態(tài)的在應(yīng)用程序運(yùn)行過(guò)程中使用資源文件。
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3610瀏覽量
91187 -
編譯器
+關(guān)注
關(guān)注
1文章
1659瀏覽量
50053 -
Qt
+關(guān)注
關(guān)注
2文章
314瀏覽量
38957 -
資源系統(tǒng)
+關(guān)注
關(guān)注
0文章
2瀏覽量
5317 -
命令行
+關(guān)注
關(guān)注
0文章
81瀏覽量
10548
原文標(biāo)題:Qt資源系統(tǒng),再也不用擔(dān)心按鈕圖標(biāo)不見(jiàn)了
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
ST-Link驅(qū)動(dòng)不見(jiàn)了怎么解決?
顯示桌面不見(jiàn)了怎么辦?任務(wù)欄和xp顯示桌面圖標(biāo)不見(jiàn)了?
Win7筆記本任務(wù)欄中的電源圖標(biāo)不見(jiàn)了怎么辦
PSIM為什么背景變白,電路圖不見(jiàn)了呢
pcb文件打開(kāi)時(shí)貼片焊盤(pán)不見(jiàn)了
PCB布線(xiàn),網(wǎng)絡(luò)飛線(xiàn)不見(jiàn)了
Win10系統(tǒng)的回收站不見(jiàn)了的解決方法
labview出報(bào)表excel橫線(xiàn)不見(jiàn)了
奇葩的問(wèn)題,簇的邊框不見(jiàn)了。
生成exe時(shí)出錯(cuò),源程序不見(jiàn)了怎么解決?
為什么我的原理圖編譯過(guò)來(lái)封裝不見(jiàn)了?
為什么AD17拼板后淚滴不見(jiàn)了?
垃圾箱刪除了不見(jiàn)了怎么辦

評(píng)論