图片是一种资源,而在Qt中,对于资源的使用是有其独特的方式的!
①:一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建。
②:而对于资源而言:我们都是需要先将其加入到这棵树中才能加载到内存中并被程序使用!!
③:而将一个图片资源放到程序的资源对象树中是用函数QResource::registerResource()来实现的。亦即:要将资源向这颗资源对象树进行注册,这样才对在系统中new创建这个资“叶子”。
Qt中经常会使用一些图片作为程序的界面,经常用的有三种方法,这里借鉴了小窦朋友的方法总结
1、在程序运行时候加载图片,
也是最简单的方法
image=new QImage("1.png");
这种方法在程序运行时候再去加载图片,需要在程序的运行目录下添加事先放置好图片,这样做的优点是程序运行时候不需要的图片不加载,节省了内存,但是读取速度慢。
2、将图片编译进工程中,
这样在程序发布时候不需要在目录下放置图片,主要通过的是.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");
3、手动进行注册
第二种方法相当于静态加载,但很多情况下我们更希望是动态加载,亦即:用到哪个资源才将该资源加载进来,而不用的则不加载。
上边第二种方法之所以显示出静态加载的特性,这是由于系统一次性自动把所有图片资源都进行了注册,并且在程序运行过程中一直没有进行反注册才导致的。 如果我们可以自行决定:什么时候对那一部分图片资源进行注册?什么时候对哪一部分图片资源进行反注册。则显然我们可以手动控制整个资源在内存中的生存周期!!
这种方法的主要步骤为:
①:生成外部二进制资源文件。
②:在需要时将该资源向程序的资源对象树进行注册并使用。
③:在不需要时进行反注册。
步骤①主要是用了Qt自带的一个工具:rcc.exe (处于bin文件夹中)。这是Qt的一个资源编译器,其编译对象是qrc文件,而生成rcc二进制资源文件。
那我们可以用它来执行命令 rcc -binary name.qrc -o name.rcc 来把qrc资源文件转成rcc二进制资源文件。
而后在程序内部:当需要使用某一图片资源时:则直接调用
QResource::registerResource(“name.rcc”)进行注册创建分配内存即可! 而不使用时候则调用反注册函数!!
这种方式算是动态加载,会少占用内存。但是如果图片过多的话,什么时候需要加载,什么时候需要去掉,这些逻辑就需要十分注意了。
来源:http://sue602.blog.163.com/blog/static/314953072010101723453987/
分享到:
相关推荐
QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码QGis+qt实现缩略图工程源码...
1、Qt4中学习使用QtCharts绘图五:绘制折线图 2、实例带源码工程
采用多线程技术,通过kinect2.0获得三种图像数据实时显示在qt界面中。改代码对初步接触kinect2.0的同学有较大帮助。适合入门级同学 环境:win10 vs2012 C++
Qt6绘制折现图完整工程,折线图支持缩放等操作。
qt使用boost工程模板
Qt编写的给图片加水印的工具,选择图片所在文件夹,即可批量自动给图片加水印,加水印过程中没有用多线程,会卡住界面。但适合自己批量加水印的小工具。
整理Qt例程中的svg图片显示,将显示图片放在label控件上(重写事件过滤器方法,参照料此方法可放在其他控件上),环境为ubuntu16.04 + Qt5.6.1,在win+Qt环境下程序工程也可打开编译(亲测)。
通过QTcpSocket、QTcpServer进行TCP编程,包括客户端和服务端,实现传输图片、文本并显示在屏幕。本工程可使用Qt或Qt+VS。
Beyond Compare 的图像比较功能很强大,...基于Qt+OpenCV实现了一个简易模仿版本,OpenCV强大的图像读取保存功能确保了图像读取结果正确,Qt界面则简单的实现了比较的功能(显示原图、显示差异图、手动选择差异阈值)。
基于qt和opencv的图片变形程序,包含球面镜变形、B样条变形、TPS变形三种变形方式 包含可执行文件和工程源码
使用QT打开工程文件; 修改.pro文件中的库路径; 设置kits,编译运行。 使用说明 主要介绍了libusb的设备打开,端口打开,以及中断方式传输数据; 主要介绍了Qt的视图框架QGraphicsView、QGraphicsScene和...
实现功能:利用VS2012封装生成动态链接库(.dell和.lib)给QT调用 文件包含:1.VS2012生成动态库工程 2.QT5.5.1调用VS2012动态库工程(注释内含调用具体方法) 3.QT调用运行结果图片
Qt 图片浏览器 沈阳工程学院 mini2440 linux课设 课设高分作品,无需修改,直接=最后答辩,轻松2周。
本工程是使用QT 5.5和VS2010开发的流程图设计简易工具,QT SDK和VS的QT插件下载请参考:http://blog.csdn.net/joy58061678/article/details/50982576,源码参考URL为:...
QT c++ dijkstra最短路径工程源码
Qt图片找不同,内附示例图片。相同部分为黑色,不同部分其他颜色显示出来,分分钟找不同,x64/release里有exe文件,可直接运行,代码也在工程文件中。
本工程使用Qt5QML,绘制实时折线图,提供canvas基本使用方法
嵌入式Qt图片移动)工程建立过程描述完成; b)UI界面控件属性修改方法描述清楚; c)程序设计思想描述清楚; d)定时器方法功能描述清楚; e)程序可执行;
1 Qt5框架和OpenGL模块:需要安装和配置Qt5开发环境,确保包括OpenGL模块,以便在Qt应用程序中使用OpenGL进行图形渲染。 2 提供以不同方式加载机械臂各关节的STL格式的三维模型文件的接口。 3 绘制机械臂的几何...