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

    总的来说,就两种方式。
    一种就是使用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将图片写入控件之后所占用的内存是一样的,增加的内存不是图片自身的大小,而是增加了几倍,并且与所使用的控件的大小有关,这样的话必然导致内存占用率增大。
   
当你的工程中使用的标签等控件很多,并且需要大量的外部图片来覆盖这些控件,当你频繁的使用这些控件的时候,会出现内存大量占用,而且是呈现累计趋势的,最后造成内存溢出的错误。这种时候可以使用多进程的方法,可以将不同的界面做成不同的进程,当这个界面操作完成之后,关闭进程,该进程占用的内存清空,只是在进程切换的时候可能速度上有所变慢,但是可以保证占用内存资源少。

关于QT下资源使用和资源占用…的更多相关文章

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

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  2. QT内置的ICON资源

    QT内置的ICON资源保存在QStyle类里. 可以通过成员函数 QStyle::standardIcon 来获取. 保存的icon有: enum QStyle::StandardPixmap Thi ...

  3. 将IDEA maven项目中src源代码下的xml等资源文件编译进classes文件夹

    如果使用的是Eclipse,Eclipse的src目录下的xml等资源文件在编译的时候会自动打包进输出到classes文件夹.Hibernate和Spring有时会将配置文件放置在src目录下,编译后 ...

  4. REST风格下如何放行静态资源

    在配置DispatcherServlet(前端控制器)时,如果把拦截路径配置成rest风格(即斜杠/),则会将静态资源也一并拦截(比如.css .js ,jpg)为了避免这个情况,可以把拦截路径设置成 ...

  5. 【转】 MATLAB下如何指定GPU资源

    [转] MATLAB下如何指定GPU资源 原文链接

  6. unity5打包机制下,一种资源打ab和资源管理的方案

    unity5打包机制下,一种资源打ab和资源管理的方案.1.打ab: 1.设置平台 2.清楚所有资源的assetbundlename: string[] abNameArr = AssetDataba ...

  7. windows下Jmeter压测端口占用问题(亲测有效)

    windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...

  8. k8s资源需求及资源限制

    在k8s上,可由容器或pod请求或消费的计算资源时指cpu和内存,这也是目前仅有的受支持的两种类型.相比较来说,cpu属于可压缩资源,即资源额度可按需收缩,而内存则是不可压缩型资源,对其执行收缩操作可 ...

  9. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

随机推荐

  1. 打包github上的项目,并在本地使用

    在GitHub上去找工具并把地址克隆下来 在本地创建一个文件夹,文件夹内右击 (建议路径为英文,并保证本机有github的软件: https://jingyan.baidu.com/article/9 ...

  2. spring boot 入门之 helloworld

    第一步:创建一个普通的maven项目 第二步:配置springboot基础依赖配置(即配置pom和启动类) POM配置 <project xmlns="http://maven.apa ...

  3. Kali Linux & Metasploit Framework

    systemctl enable postgresql.service systemctl start postgresql.service # systemctl status postgresql ...

  4. Metasploit运行环境内存不要低于2GB

    Metasploit运行环境内存不要低于2GB  Metasploit启用的时候,会占用大量的内存.如果所在系统剩余内存不足(非磁盘剩余空间),会直接导致运行出错.这种情况特别容易发生在虚拟机Kali ...

  5. 创建线程的第三种方式——使用Callable接口

    Callable是类似于Runnable的接口,实现Callable的类和实现Runnable的类都是可被其他线程执行的任务. 优点:有返回值 缺点:实现繁琐 简单实现: CallableAndFut ...

  6. mysql注释方法【自用】

    原文链接:https://www.jb51.net/article/125991.htm 一.MySQL支持三种注释方式: 1.从‘#'字符从行尾. 2.从‘-- '序列到行尾.请注意‘-- '(双破 ...

  7. 支持不同Android设备,包括:不同尺寸屏幕、不同屏幕密度、不同系统设置

    Some of the important variations that you should consider include different languages, screen sizes, ...

  8. FCC学习笔记(一)

    除了像素,你还可以使用百分比来指定border-radius边框半径的值. 给你的猫咪图片一个50%的border-radius. a元素,也叫anchor(锚点)元素,既可以用来链接到外部地址实现页 ...

  9. json格式的数据及遍历:

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  10. Linux_常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)

    1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...