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

原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想

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

http://www.cnblogs.com/lzjsky/archive/2012/08/20/2647471.html

总的来说,就两种方式。

一种就是使用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

时间: 2024-10-22 23:26:44

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

动态加载资源文件(ResourceDictionary)

原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<Application.Resources>里添加相应的样式内容,当然也可以在控件所在的控件的资源(如:<UserControl.Resources>)中添加相应样式内容 2.通过后台代码向当前程序的资源中动态添加,代码如下:(TextBlockStyle.xaml是一个ResourceDicti

Qt动态加载ui文件(实现加载客户自定义的一些widget,如QVTKWidget)

利用Qt动态加载ui文件主要是实现ui设计和软件设计的分离,ui只需要向编程人员提供各个控件名称即可.这样做可以满足软件设计后期,由于客户需求,ui风格多变的情况下,不影响编程人员的开发. 具体实现:网上资料较多,一般利用QuiLoader ,只能加载Qwidget 或者QFrame,以下代码主要实现加载的Qwidget 窗口的子窗口有一些用户自定义的Widget ,这里我想加载的是QVTKWidget QString uiFilePath = "E:\\TASK\\CTSoftware\\Qt

unity3d Resources.Load动态加载资源

初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习 Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源 而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成 一:Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建

NHibernate动态加载资源文件

最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实现 3.数据库可能有多个,且有可能是不同的数据库类型,如A系统用Oracle,B系统用MSSQL (第一点很简单,可以参照其他博客:本节主要记录第二点第三点,关于如何配置多数据库下次记录) 复杂SQL的实现,且针对不同数据库,那么需要加载不同的资源文件. 关于资源文件,请参考http://blog.

JavaScript动态加载资源

//动态加载样式 function dynamicLoadingCss(path){ if(!path || path.length === 0){ return false; } var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.href = path; link.rel = 'stylesheet'; link.type = 'text/cs

android动态加载已安装和未安装的apk资源

在android开发中动态加载已安装和未安装的apk资源,是很有用的,可以用来实现换肤功能等等.今天我们来学习. 首先新建一个工程plugpicinstall,我们需要往该工程的asset目录和drawable目录下拷贝一些呆会需要加载的图片.运行该工程,即安装. 我们先看看如何实现加载已经安装的apk中的资源: 我们需要先写两个方法,用来获取对应的已安装的apk的context对象和resource对应的id,如下: /** * 该方法用来获取已经安装的apk对应的context对象 * @r

[转]预加载资源研究

原文: http://www.otakustay.com/prefetch-resource/ 什么是预加载 所谓预加载,就是通过一定的编程方法,使浏览器在空间的时候,在后台通过HTTP请求访问某些资源.当用户在一段时间后真正使用这些资源的时候,相比一个完整的(返回200)的请求,可以更快地获得这些资源(返回304或者直接命中浏览器缓存). 预加载在部分情况下有着十分重要的意义,特别是当确定某些资源用户在短时间内会使用,如分页列表的上一页和下一页.以及一些常用的LOGO之类的图片等. 预加载资源

Aery的UE4 C++游戏开发之旅(4)加载资源&amp;创建对象

目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetReference TSoftObjectPtr<T> 同步加载资源 LoadObject/LoadClass TryLoad/LoadSynchronous 异步加载资源 FStreamableManager.RequestAsyncLoad() 卸载资源 创建对象 创建一般对象 创建Actor派生类

qt静态库编译加载资源的问题

qt有一套资源管理系统,如果将资源编译到可执行文件中,则可以直接访问可执行文件中的资源文件, 访问方式如下 :/prefix/location 但有的时候可以因为资源比较大,所以我们需要把资源编译成外部二进制资源文件*.rcc文件,这样可以提高可执行文件的加载速度. 编译方式rcc -binary myresource.qrc -o myresource.rcc 然后通过 QResouce::registerResouce("")//指定二进制资源的路径,将二进制资源加载进去即可 详见