qt之窗口换肤

摘要:
1.相关文章:qt资源系统的moc、uic和rcc命令的使用。2.总结。毕业两年后,我一直在使用qt接口库开发程序。我使用过vs08、10、13和其他开发工具,并安装了qt插件。最近,我一直在做客户换肤功能。所以我对qt的qrc做了一些研究。相对于看文件,我是一个实际的人。

1、相关文章

Qt 资源系统
qt的moc,uic,rcc命令的使用


2、概要
    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08、10、13等开发工具,并安装了qt的插件,最近在做客户端换肤功能,所以就对qt的qrc做了点儿研究,我是一个实干派(可能有点儿虚),相对于看文档来说。本文开头我就给出了两篇博客,这两篇博客对我理解qrc这个东西有很大的帮助,接下来我就简单分析下我的理解。

    首先说明下qrc是qt的东西,而不属于vs,这也很容易证明,那就是vs的工程师不识别qrc文件的,如果需要使用qrc文件,那么是需要我们手动新建一个txt,然后改后缀并添加到vs工程里。添加到vs工程里的qrc文件如果我们要打开它,可以qt自带的qt resource editor,如图1所示。而我们使用qrc也有多种方式,本文中会提及到两种方式(不知道还有第三种没),一种是把qrc文件使用rcc编译成qrc_xxx.cpp文件,这个文件以静态的C++压缩二进制数组包含了所有图片和其他资源的数据;另一种是把qrc文件用rcc编译成rcc二进制文件(rcc -binary r.qrc -o r.rcc).
qt之窗口换肤第1张

图1

3、换肤理解
    铺垫了qrc的东西后,我先说说我对换肤的理解,可能有失偏颇,但总归是个人见解,大牛勿喷。
    qt程序换肤,个人理解可以从这两点来修改:rgb+png,咋一看似乎不能理解,其实也挺好理解,接下来我就说下我自己的换肤过程
rgb替换
    所谓rgb替换就是单纯的颜色替换,这个也可能是我们大多数人都会使用的一种换肤。其实原理很简单,就是把所有的stylesheet描述都拿出来,然后放到一个qss文本文件中,把这个文件添加到qrc文件中,qrc中的内容最终会被编译成二进制数据供我们程序使用,编译的方式就是前文中提及到的两种方式。
加载qss文件并使用到全局代码如下:

qt之窗口换肤第2张qt之窗口换肤第3张
 1 QFile file(filename);
 2 if (!file.open(QFile::ReadOnly))
 3 {
 4     return;
 5 }
 6 
 7 QTextStream in(&file);
 8 
 9 in.setCodec("UTF-8");
10 QString qss = in.readAll();
11 
12 qApp->setStyleSheet(qss);
View Code

    上边这个方法的参数就是qss文件在qrc中的资源路径,可以使用该方法随时进行rgb换肤。

关于rgb换肤,在写代码时我也给出了一下建议
1、使用setStyleSheet的过程中不能和逻辑代码一起
2、每个gui类只使用1次setStyleSheet,所有的设置都尽可能的放在构造函数中,方便以后查找
3、考虑到每个可能需要换肤的widget,都需要使用setObjectName方法为其命名,并且名称不能和其他控件名称重复
4、使用setStyleSheet方法时,注意格式,建议格式为:class#objectname{}
    当然了了解qss语法之后,你会发现第四种方式只是比较简单的类选择器,如果对qss语法比较熟悉的也可以使用更高级的方式,如图2所示,是一个qss文件示例
qt之窗口换肤第4张

图2


    说到qss的语法,我这儿给出一个qss的坑:当类属性发现变化时需要重置qss,qt qss博文中也有相应的说明,虽然这篇博客是我转的,但是其中有加入我自己的理解。
关于qss风格重置我写了一下共有方法

1 void ResetStyleSheet(QWidget * widget)
2 {
3     QString sheetStr = widget->styleSheet();
4     widget->setStyleSheet("");
5     widget->setStyleSheet(sheetStr);
6 }

图片资源替换
图片资源替换我只给出我自己的测试结论,关于更理论的知识可以参考我给出的第一篇文章
方式1:把qrc打到dll中,这种在使用vs的时候是比较简单的,只需要把qrc加入到vs工程就可以了。
方法2:把qrc编译成rcc文件,使用rcc命令:rcc -binary r.qrc -o r.rcc

4、不管是使用哪一种方式,一下四个方法都是很有用的
Q_INIT_RESOURCE(filename);//加载一个qrc文件
Q_CLEANUP_RESOURCE(filename);//清理一个qrc文件,使用vs方式加载的qrc文件,可以使用这种方式清理
QResource::registerResource("filename.rcc");//注册一个rcc文件,该文件是用qrc文件编译而成,结果和Q_INIT_RESOURCE一样
QResource::unregisterResource("filename.rcc");//反注册一个rcc文件,结果和Q_CLEANUP_RESOURCE一样

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 
qt之窗口换肤第5张qt之窗口换肤第6张

  


很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。 

奋斗中的无名小卒。。。

免责声明:文章转载自《qt之窗口换肤》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jvm锁的四种状态 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

vs下调试程序时,把信息打印到输出窗口

重印:https://blog.csdn.net/cwj066/article/details/82423627 https://stackoverflow.com/questions/20508086/getting-rid-of-atltracegeneral-category-shown-in-atltrace-output方法1:编写一个变量参数函数...

C# 获取枚举 Enum 变量值的 Description 属性

如何在C#中读取枚举值的描述属性?有以下枚举:123456 public enum enum Langage{[System.ComponentModel.Description]Chinese,English}我们希望得到的是中文中的“Chinese”描述。123456789 publicstringGetEnumDescription{stringstr...

element 导航菜单 控制路由跳转

处理中心<我的平台<templateslot=“title”>选项1<el menu itemindex=“2-4-3”>选项3<消息中心<el menu itemindex=“4”>//www.ele.me“rel=”externalnofall...

buildroot使用介绍【转】

整个Buildroot由Makefile脚本和Kconfig配置文件组成。就像编译Linux内核一样,您可以编译一个完整的Linux系统软件,该软件可以通过buildroot配置和menuconfig修改直接写入机器。使用buildroot构建基于qemu的虚拟开发平台。请参阅通过buildroot+qemu构建ARM Linux虚拟开发环境。工具链--˃配...

sqlserver2016安装

2008以前的版本在SQLserver配置管理其中设置。...

tomcat不打印日志的原因及解决办法

tomcat的日志在刚启动的时候可以正常打印,系统正常运行几天以后就会出现不打印日志或者日志打印的内容缺少的情况,但是系统还是可以正常使用的,重启tomcat以后日志打印就又正常了,请问一下这是什么原因呢?日志框架使用的是log4j,使用了日志按天分割,每天的日志量是5G左右1.下载日志jar包,例如:commons-logging-1.1.1.jar。放在...