圖片是一種資源,而在Qt中,對於資源的使用是有其獨特的方式的!數組
①:通常來講:資源在內存中是用資源對象樹來表示的,該樹在程序啓動時建立。ide
②:而對於資源而言:咱們都是須要先將其加入到這棵樹中才能加載到內存中並被程序使用!!函數
③:而將一個圖片資源放到程序的資源對象樹中是用函數QResource::registerResource()來實現的。亦即:要將資源向這顆資源對象樹進行註冊,這樣纔對在系統中new建立這個資「葉子」。工具
Qt中常常會使用一些圖片做爲程序的界面,常常用的有三種方法,這裏借鑑了小竇朋友的方法總結spa
一、在程序運行時候加載圖片,.net
也是最簡單的方法對象
image=new QImage("1.png");blog
這種方法在程序運行時候再去加載圖片,須要在程序的運行目錄下添加事先放置好圖片,這樣作的優勢是程序運行時候不須要的圖片不加載,節省了內存,可是讀取速度慢。圖片
二、將圖片編譯進工程中,內存
這樣在程序發佈時候不須要在目錄下放置圖片,主要經過的是.qrc文件,例如添加image.qrc文件,這個文件會在編譯時候生成qrc_image.cpp文件,,咱們能夠本身看下這個生成的cpp文件,發現其中就是主要有三個static const數組。
qt_resource_data[]
qt_resource_name[]
qt_resource_struct[]
這其中qt_resource_data[]中存放的就是圖片的二進制數據。然後邊的兩個數組咱們猜想是作了一個圖片名字到上邊數據的映射,方便系統找到data中的二進制數據。
至於內部做用機制,有的資料上說是:當使用qrc資源文件時:系統會自動將全部的圖片資源都向程序的資源對象樹進行註冊,而且當程序結束運行時再進行反註冊。這也正好解釋了爲何此種方法下圖片資源會一直佔用內存的緣由。
使用這種方法時:因爲圖片資源一直在內存中,避免了I/O操做,從而加快了讀取速度。可是倒是以消耗內存爲代價的
方法以下:
在qrc文件中加上下面的代碼。
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>1.png</file>
<file>2.ico</file>
</qresource>
</RCC>
而後再.pro文件中添加下面的代碼
RESOURCES = res.qrc
在程序中使用圖片文件時候,經過
:1.png的方法來使用
例如
image=new QImage(":1.png");
三、手動進行註冊
第二種方法至關於靜態加載,但不少狀況下咱們更但願是動態加載,亦即:用到哪一個資源纔將該資源加載進來,而不用的則不加載。
上邊第二種方法之因此顯示出靜態加載的特性,這是因爲系統一次性自動把全部圖片資源都進行了註冊,而且在程序運行過程當中一直沒有進行反註冊才致使的。 若是咱們能夠自行決定:何時對那一部分圖片資源進行註冊?何時對哪一部分圖片資源進行反註冊。則顯然咱們能夠手動控制整個資源在內存中的生存週期!!
這種方法的主要步驟爲:
①:生成外部二進制資源文件。
②:在須要時將該資源向程序的資源對象樹進行註冊並使用。
③:在不須要時進行反註冊。
步驟①主要是用了Qt自帶的一個工具:rcc.exe (處於bin文件夾中)。這是Qt的一個資源編譯器,其編譯對象是qrc文件,而生成rcc二進制資源文件。
那咱們能夠用它來執行命令 rcc -binary name.qrc -o name.rcc 來把qrc資源文件轉成rcc二進制資源文件。
然後在程序內部:當須要使用某一圖片資源時:則直接調用
QResource::registerResource(「name.rcc」)進行註冊建立分配內存便可! 而不使用時候則調用反註冊函數!!
這種方式算是動態加載,會少佔用內存。可是若是圖片過多的話,何時須要加載,何時須要去掉,這些邏輯就須要十分注意了。