图片是一种资源,而在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”)进行注册建立分配内存便可! 而不使用时候则调用反注册函数!!
这种方式算是动态加载,会少占用内存。可是若是图片过多的话,何时须要加载,何时须要去掉,这些逻辑就须要十分注意了。