最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法。网上最常见的帖子是这个,感觉总结的还不错。

    总的来说,就两种方式。
    一种就是使用qrc资源文件,也就是在QT的工程中添加资源文件,这个方法比较简单容易操作,对于初学者来说比较容易上手,在资源比较少的时候可以使用。但是也有它的缺点,就是添加的资源文件(如qrc.cpp)会直接被存放到静态数组中,从而一直占用内存,使内存的利用率不高。有的时候如果资源过大,可能编译都无法通过,会造成out of memory的错误。
    这个时候,就需要第二种方法,就是通过从外部引用资源二进制文件(一般为rcc文件)。具体的使用方法见上面的帖子,写的很详细。
    这里主要说一下感觉写的不详细的地方。
    本帖主要针对windows下的QT平台。
    首先要想生成资源二进制文件,先要在QT的工程中添加资源文件(.qrc格式,不会添加的先学如何使用qrc吧),将所有的图片资源添加成功之后,保存工程,在.qrc格式的文件下右键,选择在此处打开命令台(也就是常用的dos格式),打开之后输入命令rcc -binary name.qrc -o name.rcc  来把qrc资源文件转成rcc二进制资源文件。生成后的rcc二进制文件位于工程目录下。那么,接下来就可以进行注册了。关于QT的注册管理机制,上面的帖子有介绍。
       如何进行注册??
       在注册之前请将工程中你所建立的qrc文件删除,否则没有什么意义了,qrc就是用来生成rcc文件的。
       首先,将生成的RCC文件拷贝到你的可执行文件的目录下,可以是debug,也可以是release.然后调用函数              
     QResource::registerResource("debug/abc.rcc");
     注意,如果没有debug的话,那么注册不会成功。为什么前面需要一个debug?
     这里牵扯到一个相对路径的问题,本人也没有多做研究。简单来说,相对路径是相对于当前工作目录而言的,所以,如果你觉得你不知道当前的工作目录,那么可以通过qDebug() << QDir::currentPath();从而你可以知道你当前工作目录下,知道了当前工作目录,就可以轻松的选择相对目录了。
     注册成功后,你可以通过任务管理器观看相应的内存占用,会发现内存增加了,就是你所添加的资源文件的大小。
     注册完成后,就可以按照使用qrc资源的方法来使用了。原来怎么操作,现在也怎么操作。
     如果你不想使用这部分资源了,可以使用反注册,从而将这部分资源从内存中删除。
     调用 QResource::unregisterResource("debug/abc.rcc");//这样,就可以将资源从内存中删除,可以节省内存。
     
     在这个过程中,发现了一个问题。就是关于setstylesheet的问题。
     ui -> label -> setStyleSheet("QLabel{border-image:url(:/home/image/DSC05363.JPG);}");
        在这里,还要说明一个问题。为什么路径前面有一个冒号。这个路径其实也是相对路径,有冒号说明是qrc资源文件的相对路径。
       如上所示,注册了资源之后,按照使用qrc资源的方法可以调用图片,但是该图片一经调用进入label中,内存会急剧增大,原来该图片(使用的格式为jpg格式)为4M,调用进入label后,增加了93M左右的内存,只有将这个label标签清空之后,内存才会恢复到原来的大小(在windows QT下)。
     原来,QT在对图片进行操作时,是将外部的图片按像素写入的,经过实验发现,无论是何种格式的图片,无论大小如何,只要像素点相同,那么在QT将图片写入控件之后所占用的内存是一样的,增加的内存不是图片自身的大小,而是增加了几倍,并且与所使用的控件的大小有关,这样的话必然导致内存占用率增大。
    当你的工程中使用的标签等控件很多,并且需要大量的外部图片来覆盖这些控件,当你频繁的使用这些控件的时候,会出现内存大量占用,而且是呈现累计趋势的,最后造成内存溢出的错误。这种时候可以使用多进程的方法,可以将不同的界面做成不同的进程,当这个界面操作完成之后,关闭进程,该进程占用的内存清空,只是在进程切换的时候可能速度上有所变慢,但是可以保证占用内存资源少。

http://www.cnblogs.com/swarmbees/p/5621403.html

QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)的更多相关文章

  1. 从高德 SDK 学习 Android 动态加载资源

    前不久跑去折腾高德 SDK 中的 HUD 功能,相信用过该功能的用户都知道 HUD 界面上的导航转向图标是动态变化的.从高德官方导航 API 文档中 AMapNaviGuide 类的描述可知,导航转向 ...

  2. 【Unity3D】Unity3D之 Resources.Load 动态加载资源

    [Unity3D]Unity3D之 Resources.Load 动态加载资源 1.Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹 ...

  3. Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)

    Posted on 2012-03-23 11:21 祥叔 阅读(2886) 评论(6) 编辑 收藏 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: 1.       内联样式 ...

  4. unity3d动态加载资源

    在Unity3D的网络游戏中实现资源动态加载 分类: 最新学习2012-06-14 13:35 1127人阅读 评论(0) 收藏 举报 网络游戏nullvectorjson游戏string 用Unit ...

  5. unity3d Resources.Load动态加载资源

    初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...

  6. 动态加载资源文件(ResourceDictionary)

    原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...

  7. [UE4]一个好用的虚幻4插件,根据资源名称动态加载资源,GetCurrentLeveName(获得当前地图名称)

    下载地址 一.下载与UE4相对应的版本 二.在工程根目录新建Plugins目录,解压插件. 三.如果工程已经打开,则需要重新打开   四.重新打开工程后,右下角会有提示有新插件可用. 五.这个插件提供 ...

  8. 利用“反射”动态加载R文件中的资源

    前几天做一个Android下面数据库相关的应用.用ListVIew展示表中数据的时候我希望能给表中每一条记录,加一个展示的图片.但是用数据库保存图片是比较难搞的.于是就把所需图片都保存到res下的dr ...

  9. WPF 界面实现多语言支持 中英文切换 动态加载资源字典

    1.使用资源字典,首先新建两个字典文件en-us.xaml.zh-cn.xaml.定义中英文的字符串在这里面[注意:添加xmlns:s="clr-namespace:System;assem ...

  10. JavaScript动态加载资源【js|css】示例代码

    在开发过程中会用到各种第三方的插件,或者自己写在单独文件中的js方法库或者css样式,在html头部总是需要写一大堆的script和link标签,如果想要自己实现动态的引入资源文件,可以使用开源的re ...

随机推荐

  1. HDU_1230——火星A+B,加法进制问题

    Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上 ...

  2. hdu-1800

    思路: 这题被坑的不轻. 首先花了一段时间想明白了思路是要找出现次数最多数字,以为这题就这样解决了,结果发现每个数字的最大长度是30,long long都装不下,因此就要用字符串来保存处理.然后在in ...

  3. Google Code Jam 2012 round 2 problem A: Swinging Wild

    题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...

  4. 为什么选择Premium Fabric Shanghai

    展商首页 为什么选择Premium Fabric Shanghai

  5. Hadoop2.4.1 64-Bit QJM HA and YARN HA + Zookeeper-3.4.6 + Hbase-0.98.8-hadoop2-bin HA Install

    Hadoop2.4.1 64-Bit QJM HA and YARN HA Install + Zookeeper-3.4.6 + Hbase-0.98.8-hadoop2-bin HA(Hadoop ...

  6. HDOJ 3622 - Bomb Game 2-sat+二分....细心...

    题意: 有N个炸弹..每个炸弹有两个位置可以选择..把炸弹放到其中一个地方去...炸弹的爆炸范围是其为圆心的圆...两个炸弹不能有攻击范围上的重合..问要满足条件..炸弹爆炸范围的半径最长能是多少.. ...

  7. PHP各版本之间差异

    PHP5.3 __toString 魔术方法不再接受参数. 魔术方法 __get, __set, __isset, __unset, and __call 应该总是公共的(public)且不能是静态的 ...

  8. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  9. 使用带Arduino IDE & WIZ820io的ATmega1284P

    使用带Arduino IDE & WIZ820io的ATmega1284P 2013/07/04 | Filed under:   IO模块 and tagged with:   arduin ...

  10. SMO(Sequential Minimal Optimization) 伪代码(注释)

    Algorithm: Simplified SMO 这个版本是简化版的,并没有采用启发式选择,但是比较容易理解. 输入: C: 调和系数 tol: 容差 (tolerance) max passes: ...