RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt資源系統(tǒng),再也不用擔(dān)心按鈕圖標(biāo)不見了

嵌入式小生 ? 來源:嵌入式小生 ? 2023-02-21 09:41 ? 次閱讀

一、資源系統(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)為例),輸入以下命令:

82130b44-b184-11ed-bfe3-dac502259ad0.png

備注:這里windows命令行工作區(qū)目錄需要切換到.qrc文件所在的文件夾下,如上,筆者的工程項(xiàng)目的.qrc文件位于上述文件路徑。然后再輸入上述命令,便可使用rcc工具生成對應(yīng)的資源文件。如下圖:

82378168-b184-11ed-bfe3-dac502259ad0.png

上圖所示目錄下的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)一的整體,如下圖所示:

824ede1c-b184-11ed-bfe3-dac502259ad0.jpg

通過這種方式,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)行過程中使用資源文件。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3541

    瀏覽量

    88621
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49108
  • Qt
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ST-Link驅(qū)動不見了怎么解決?

    用了很久的ST-Link驅(qū)動突然不見了,重新安裝設(shè)備管理器里面也沒有,電腦重啟也沒用,到底怎么了,應(yīng)該怎么辦?[/tr]
    發(fā)表于 03-18 06:37

    顯示桌面不見了怎么辦?任務(wù)欄和xp顯示桌面圖標(biāo)不見了?

    顯示桌面不見了怎么辦?任務(wù)欄顯示桌面不見了?工具欄顯示桌面不見了?xp顯示桌面不見了 ?顯示桌面圖標(biāo)不見
    發(fā)表于 06-19 10:44

    AD09 PCB飛線不見了怎么辦?

    大家好,AD09 PCB飛線不見了怎么辦?
    發(fā)表于 03-27 14:04

    Win7筆記本任務(wù)欄中的電源圖標(biāo)不見了怎么辦

    Win7任務(wù)欄中的電源圖標(biāo)不見了怎么辦:很多時(shí)候我們需要將自己的筆記本電腦帶出門,因此電量就是我們最關(guān)注的問題了,因?yàn)椴皇敲總€地方都有電源的,但是最近有些用戶發(fā)現(xiàn)Windows7系統(tǒng)的任務(wù)欄通知區(qū)域
    發(fā)表于 05-21 16:20

    PSIM為什么背景變白,電路圖不見了

    之前畫好的電路圖,不知道點(diǎn)到哪了,電路圖就不見了,背景也變白了,但是運(yùn)行還是正常的,這是怎么回事,怎么才能把電路圖顯示出來
    發(fā)表于 04-23 09:44

    pcb文件打開時(shí)貼片焊盤不見了

    本帖最后由 feifeigg5854 于 2015-6-25 19:23 編輯 pcb文件打開時(shí)貼片焊盤不見了,請各位大蝦看看是怎么回事!
    發(fā)表于 06-18 14:17

    PCB布線,網(wǎng)絡(luò)飛線不見了

    PCB布線時(shí),網(wǎng)絡(luò)飛線不見了,但是只是其中一個網(wǎng)絡(luò)飛線不見,代之的是紅色X號方框,大家遇到過嗎?
    發(fā)表于 01-09 20:52

    Win10系統(tǒng)的回收站不見了的解決方法

    設(shè)置中點(diǎn)擊“桌面圖標(biāo)設(shè)置”快捷鏈接。5、在打開的“桌面圖標(biāo)設(shè)置”窗口中,發(fā)現(xiàn)回收站沒有選中,我們在這里選中“回收站”前的勾選,點(diǎn)擊確定按鈕。接下去的精彩內(nèi)容請看:Win10系統(tǒng)的回收站
    發(fā)表于 01-27 16:20

    labview出報(bào)表excel橫線不見了

    labview出報(bào)表的時(shí)候,excel模板里面有橫線,但是一生成報(bào)表的時(shí)候,為什么線就不見了?見圖紅線部分,請問該怎么辦,謝謝
    發(fā)表于 08-10 15:52

    奇葩的問題,簇的邊框不見了

    奇葩的問題,簇的邊框不見了。 眾所周知,簇在面板顯示的時(shí)候,有個邊框,就是凹進(jìn)去的那個,讓你知道那是個簇。最近看了07年的程序,竟然沒有邊框。??如下:上一個主題:https://bbs.elecfans.com/jishu_938887_1_1.html
    發(fā)表于 09-16 14:42

    生成exe時(shí)出錯,源程序不見了怎么解決?

    生成exe時(shí)出錯,源程序不見了怎么解決?打開以后就成現(xiàn)在這樣了,求大神指教
    發(fā)表于 01-17 18:42

    為什么我的原理圖編譯過來封裝不見了?

    為什么我的原理圖編譯過來元器件我的線都還在怎么封裝不見了,感覺封裝沒錯啊
    發(fā)表于 06-05 03:03

    為什么AD17拼板后淚滴不見了?

    AD17使用復(fù)制、特殊粘貼后拼板,淚滴不見了,哪位高手知道怎么處理,謝謝!發(fā)現(xiàn)AD18、AD19都有這個問題。AD09倒是不會。
    發(fā)表于 09-29 10:03

    垃圾箱刪除了不見了怎么辦

    垃圾箱刪除了不見了怎么辦 上回我的電腦不小心把垃圾箱給刪除了,死活不見了,現(xiàn)和大家分享一下我找回來的方法: 1 在空白的電腦桌面,按右
    發(fā)表于 12-23 14:46 ?1.7w次閱讀
    垃圾箱刪除了<b class='flag-5'>不見了</b>怎么辦

    快速啟動欄顯示桌面圖標(biāo)不見了如何恢復(fù)

    很多電腦用戶在使用電腦時(shí)會出現(xiàn)桌面上的圖標(biāo)不見了,有的是快快速啟動欄顯示桌面圖標(biāo)不見了,不知道怎么找回來,這跟操作有很大的關(guān)系,下面介紹幾種常用的關(guān)于快速啟動欄顯
    發(fā)表于 10-16 11:06 ?3.2w次閱讀
    RM新时代网站-首页