一般來說,資源檔案可以在資源收集檔案(.qrc)中指定,包括字型檔案(.ttf),(.png),翻譯檔案(.qm)以及qml頁面檔案(.qml)等。
.qrc檔案中列出的資源檔案屬於應用程式源樹的一部分。在.qrc檔案中描述的資源檔案路徑也是相對於.qrc檔案所在的目錄的。當然,其中的資源檔案必須與.qrc檔案位於同一目錄或在其子目錄下。
資源可以在應用程式中以與源樹中相同的檔名(帶有:/字首)比如load(":/language/lang.zh_cn.qm")或具有qrc方案的url進行訪問,例如source:「qrc:/image/img.jpg」。
在這裡補充一句,qt資源系統與平台無關,它可在應用程式的可執行檔案中儲存二進位制檔案。
為了將資源編譯成二進位制檔案,必須在應用程式的.pro檔案中提及.qrc檔案,以便qmake知道它:
resources += resource.qrc
qmake將生成make規則,以生成乙個名為qrc_ resource.cpp的檔案,此檔案在可執行檔案所在目錄下。此檔案會鏈結到應用程式中。該檔案包含影象的所有資料和其他資源,開啟之後可以看到,主要有三個static const陣列:
qt_resource_data,qt_resource_name,及qt_resource_struct
它們是壓縮二進位制資料的靜態c++陣列。 每當.qrc檔案更改或它所引用的檔案之一更改時,都會自動重新生成qrc_ resource.cpp檔案。
上面雖然說了很多細節,但在實際操作時不需要這麼複雜,手動新增.qrc檔案,在qtcreator中.qrc檔案上右鍵新增資源檔案,在**中正確使用資源就可以了。.pro檔案中resources += resource.qrc會自動生成,qrc_ resource.cpp檔案在編譯時也會自動生成。
將資源放在.qrc檔案中是常用的引用資源的方式,不過還有另一種方式,那就是手動生成外部二進位制資源,上面那種方式qt自己將資源壓縮成二進位制,這種方式是我們手動呼叫rcc.exe(資源編譯器),將資源檔案編譯成二進位制資源檔案,在需要時在qt資源系統中註冊,然後使用,不需要時進行反註冊。
可以通過以下方式來編譯.qrc檔案中指定的一組資源資料:
rcc -binary resource.qrc -o resource.rcc
rcc.exe在bin目錄下
在應用程式中,該資源將使用以下**進行註冊:
使用(同第一種方式):
反註冊:
註冊和反註冊在數量上是對應的,註冊n次,需反註冊n次,反註冊n+1次則會返回false。
需要注意:
既然手動生成了二進位制資源檔案,.pro檔案中則不要新增resources += resource.qrc,否則還是會生成qrc_ resource.cpp檔案。
優點:
第二種方式雖然稍微繁瑣,但它的優點在於可以控制資源在記憶體中的載入。根據模組生成不同的.rcc,可以控制哪一部分資源載入,哪一部分不載入。在使用資源時註冊,不使用時反註冊,可以控制資源在記憶體中的生命週期。
我自己寫了乙個小demo驗證記憶體占用:
使用.qrc方式載入資源的程式:
資源顯示後,記憶體占用達到189m,
source:」」,visible:false,記憶體占用停在128m,過了好久停在66m,又過了將近10分鐘恢復到3.8m
使用.rcc方式載入資源的程式:
顯示後,記憶體占用達到190m(比上一種方式多出的1m是.rcc檔案的大小),
source:」」, visible:false,unregister,記憶體很快恢復到4.8m。
第二種方式可以手動控制資源的記憶體占用,而第一種方式則依賴於系統對程序占用記憶體的排程,等程序長時間沒有請求,cpu才將其占用的記憶體清除。這在不同系統平台上情況也不同。
需要注意的是,手動生成的二進位制資源檔案,註冊會占用其大小的記憶體空間。
使用Qt資源
在qt做介面的時候經常會用到一些資源,如,國際化,qss等。在qt中可以放在構建目錄下,也可以放在工程目錄中。但是放在工程目錄下的打包的時候就麻煩一些。這裡以為例,介紹一下qt資源的使用方法。1.新建乙個qt視窗專案。然後選中再新建qt資源,這樣在qt專案列表出現了新的資料夾 資源。點開資源看到qr...
QML使用資源系統
qt 資源系統允許將資源檔案作為二進位制檔案儲存在可執行檔案中,這在構建混合的 qml c 應用程式時非常有用,因為它通過資源系統的 uri 方案引用 qml 檔案 以及其他資源,例如 和聲音檔案 而不是檔案系統資源的相對路徑或絕對路徑。要在混合的 qml c 應用程式中使用資源系統 一旦完成該過程...
Qt開發總結(12) 資源系統
這篇筆記想著把最近在開發過程中的遇到的一些新的認識總結一下,關於qt的資源系統。之前我寫qt的風格是完全用 寫介面,控制項和布局都是乙個個new出來,但是在實際開發中,還是有人喜歡用qdesigner設計,這無可厚非。另外,美化這方面,大家都喜歡用qss,不管是在qdesigner中設定還是在 中寫...