当前位置: 首页 > news >正文

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

 

转载于:https://www.cnblogs.com/swarmbees/p/5621403.html

相关文章:

  • ASP.Net MVC开发基础学习笔记(1):走向MVC模式
  • 使用JDBC处理LOB大型对象
  • ASP.NET MVC生命周期介绍(转)
  • Orace expdp filesize compression
  • Java集合源码分析(一)
  • 如何设置android studio让程序运行在真机中
  • qcharts编译
  • 使用弹性布局来解决令人烦恼的垂直居中问题~~
  • Linux 数据流重定向
  • 华为架构师8年经验谈:从单体架构到微服务的服务化演进之路
  • 互联网进程及相关人物_已迁移
  • python 字典多种方法删除 keys
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • C# mouse keyboard monitor
  • Snapshot Volume 操作 - 每天5分钟玩转 OpenStack(58)
  • Google 是如何开发 Web 框架的
  • (三)从jvm层面了解线程的启动和停止
  • 【node学习】协程
  • Angular 2 DI - IoC DI - 1
  • Computed property XXX was assigned to but it has no setter
  • eclipse(luna)创建web工程
  • es6要点
  • gf框架之分页模块(五) - 自定义分页
  • Java Agent 学习笔记
  • Making An Indicator With Pure CSS
  • mongodb--安装和初步使用教程
  • php的插入排序,通过双层for循环
  • React组件设计模式(一)
  • TypeScript迭代器
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 给github项目添加CI badge
  • 如何设计一个比特币钱包服务
  • 学习笔记:对象,原型和继承(1)
  • UI设计初学者应该如何入门?
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #QT项目实战(天气预报)
  • $ git push -u origin master 推送到远程库出错
  • (¥1011)-(一千零一拾一元整)输出
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (SpringBoot)第二章:Spring创建和使用
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (十)T检验-第一部分
  • (十五)使用Nexus创建Maven私服
  • (十一)图像的罗伯特梯度锐化
  • (五)网络优化与超参数选择--九五小庞
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)菜鸟学数据库(三)——存储过程
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息