QT皮肤系统的动态切换

应用需求:

提供皮肤切换选项,在不重启应用程序的情况下实现皮肤的动态切换。

理论基础:

1) 图片资源是如何被利用的

这里先简要说明一下实现原理,皮肤的动态切换其关键在于图片资源的加载方式。QT中每个应用程序启动后都会维护属于自己的资源子库,所有的图片以及UI资源都实现编译到rcc文件中,而rcc文件是整合了所有资源的二进制文件,这种方式属于动态加载。

图片是一种资源,在QT中,对于资源的使用有以下几点:

1>  一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建。

2>    对于资源而言:都是需要先将其加入到这棵树中才能加载到内存中并被程序使用。

3>    将一个图片资源动态加载到资源的对象树中是用函数:QResource::registerResource()来实现的,即先将资源向这颗资源对象树进行注册,这样才可以在程序中使用该资源叶子。资源一旦注册到资源子树中它就会占用内存。

4>    当不再需要使用某个资源图片时,我们不希望它继续占用内存,此时需要用QResource::unregisterResource()来进行反注册。此函数的作用就是在资源对象树中遍历找到代表该资源的节点,然后delete释放它。

总的来说就是:一个程序所用到的资源都是放到一棵资源对象树中的,当程序启动时该树便会自动创建,而当我们使用某个资源时都需要实现将其向该树进行注册,当不需要时则需要进行反注册。

2) 图片资源使用的三种方式

1>  在程序运行时加载图片

这是最简单的一种使用方法,例如:image = newQImage(“1.png”),这种方法在程序运行时再去加载图片,需要在对应目录下事先放置好图片,这样做的优点是程序 运行时不需要的文件不会加载,节省了内存,但是这种方式是I/O读取,因此速度会相对慢一些。

2>  将图片编译进工程

这种方式是在pro文件下添加一行:RESOURCES = test.qrc ; qrc文件中添加了对图片资源的引用,它的格式如下:

这样程序在发布时不需要在目录下放置图片,利用该qrc文件在编译的时候会自动生成qrc_test.cpp文件,里面主要是利用三个数组来存放图片的二进制数据。

当使用qrc资源文件时,系统会自动将所有的图片资源都向程序的资源对象树进行注册,并且当程序结束时再进行反注册。使用这种方式,由于图片资源一直在内存中,避免了I/O操作,加快了读取速度,但是却是以消耗内存为代价的。

3>  手动进行注册

上面利用qrc文件是程序运行时一次性将图片资源全部加载到资源对象树中,直到程序运行结束才会反注册。而最佳的实现方式是:需要用到时,将资源加载进来,不需要的时候可以对资源进行反注册,从而可以节省内存。

这种方法的主要步骤为:

1)    利用qrc和qss文件生成rcc二进制资源文件:rcc.exe –binary test.qrc –o test.rcc

2)    在需要的时候将该资源向程序的资源对象树进行注册使用。

3)    在不需要时进行反注册。

皮肤插件系统的实现:

皮肤插件系统实现的基本逻辑图如下:

其实现原理就是根据上面的三种方式,手动进行rcc文件的注册与反注册。这里需要强调的一点是:每个模块都有自己的一套:qrc、qss以及他们生成的rcc文件,因为我们利用rcc文件就是避免它一次性将所有的资源注册上(如果每套皮肤只用一个rcc文件将所有的资源都注册上,在内存方面没有优势,只是提供了可以进行皮肤动态切换的可能,GF2中的每套皮肤就只有一个rcc文件),需要时注册,不需要时反注册,因此我们需要手动地控制哪个模块合适注册、何时反注册。比如:程序启动先注册login模块的资源文件,当登录成功后,登录界面就消失了,然后主面板开始出现,这个时候我们就可以将登录模块注册的资源文件进行反注册。如果主界面逻辑中还有一个按钮是显示所有文件同步信息的,当我们点击时,文件信息模块注册上,关闭窗口时,文件信息模块资源反注册,而此时主面板模块资源一直都是注册着的。采用这种方式,可能会花费一些精力还处理不同模块资源的注册与反注册。

总结:

这里的关键还是要理解动态方式使用rcc文件,它是插件系统得以实现的基础,本质就是向资源对象树中的注册与反注册。注意:这里充分利用了配置文件的优点,还是基于插件的体系。由于界面具体的样式还没有细调,这里就不上图了,不过已经可以实现皮肤的动态切换了。联想到其它,所有皮肤切换的实现原理都基本相似吧,自己的知识盲区中又少了一块,加油!!五一来临。

时间: 2024-07-30 23:50:34

QT皮肤系统的动态切换的相关文章

【大话QT之六】QT皮肤系统的动态切换

应用需求: 提供皮肤切换选项,在不重启应用程序的情况下实现皮肤的动态切换. 理论基础: 1) 图片资源是如何被利用的 这里先简要说明一下实现原理,皮肤的动态切换其关键在于图片资源的加载方式.QT中每个应用程序启动后都会维护属于自己的资源子库,所有的图片以及UI资源都实现编译到rcc文件中,而rcc文件是整合了所有资源的二进制文件,这种方式属于动态加载. 图片是一种资源,在QT中,对于资源的使用有以下几点: 1>  一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建. 2>   

动态切换tableView中的cell的种类

为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直接继承系统的就行了. // // RootViewController.m // ChangeCell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import "YellowCell.h&quo

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例

一.概述 基于Spring动态配置多数据源,在大型的应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效的提高系统的水平伸缩性,而这样的解决方案就会补同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求以及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. Spring配置多个数据源的方式和具体使用过程,Spring对于多数据源,以数据库表为参照,大体上可以分为两大类情况: 1.表级上的跨数据库,即对于不同的数据库却有不相同的表(表名和表结构完全

hibernate动态切换数据源

起因: 公司的当前产品,主要是两个项目集成的,一个是java项目,还有一个是php项目,两个项目用的是不同的数据源,但都是mysql数据库,因为java这边的开发工作已经基本完成了,而php那边任务还很多,人手也比较紧,产品上线日期紧促,所以领导希望java这边能够帮助php那边写接口,所以需要切换数据源 思路: 动态切换数据源确切的来说是在同一类型数据库的情况下的.意思就是说 , 在系统中的使用的数据库分布在多台数据库服务器或者在同台服务器上的多个数据库. 在运行时期间根据某种标识符来动态的选

Qt Quick 组件和动态创建的对象具体的解释

在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Connections 对象连接到组件的 colorPicked 信号,改变文本的颜色. 当时用到的 Component . Loader 两个特性,一直没来得及介绍,可能非常多人都还在雾里看花呢. 这次呢.我们就来仔细致细地把他们讲清楚. 版权全部 foruok ,转载请注明出处:http://blog.csd

基于spring的aop实现多数据源动态切换

https://lanjingling.github.io/2016/02/15/spring-aop-dynamicdatasource/ 基于spring的aop实现多数据源动态切换 发表于 2016-02-15   |   分类于 spring  | 一.多数据源动态切换原理 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此:又例如:读写分离数据库配置的系统. 1.多数据源设置: 1)静态数据源切换:一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的

Linux系统下动态库的生成

Linux系统下动态库的生成 一.简述 Linux下动态库文件的扩展名为 ".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作libthread.so.静态库的文件名形式是libname.a.共享archive的文件名形式是libname.sa.共享archive只是一种过渡形式,帮助人们从静态库转变到动态库.      小编综合自己学习体会以及网络上较好的内容,以简单的例子介绍动态库文件的生

spring框架中多数据源创建加载并且实现动态切换的配置实例代码

原文:spring框架中多数据源创建加载并且实现动态切换的配置实例代码 源代码下载地址:http://www.zuidaima.com/share/1774074130205696.htm 在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库.我们以往在spring和hibernate框架中总是配置一个数据源,因而sessionFactory的dataSource属性总是指向这个数据源并且恒定不变,所有DAO在使用sessionFa