qt之窗口换肤

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

qt之窗⼝换肤
1、相关⽂章
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).
图1
3、换肤理解
铺垫了qrc的东西后,我先说说我对换肤的理解,可能有失偏颇,但总归是个⼈见解,⼤⽜勿喷。

qt程序换肤,个⼈理解可以从这两点来修改:rgb+png,咋⼀看似乎不能理解,其实也挺好理解,接下来我就说下我⾃⼰的换肤过程
rgb替换
所谓rgb替换就是单纯的颜⾊替换,这个也可能是我们⼤多数⼈都会使⽤的⼀种换肤。

其实原理很简单,就是把所有的stylesheet描述都拿出来,然后放到⼀个qss⽂本⽂件中,把这个⽂件添加到qrc⽂件中,qrc中的内容最终会被编译成⼆进制数据供我们程序使⽤,编译的⽅式就是前⽂中提及到的两种⽅式。

加载qss⽂件并使⽤到全局代码如下:
1 QFile file(filename);
2if (!file.open(QFile::ReadOnly))
3 {
4return;
5 }
6
7 QTextStream in(&file);
8
9in.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⽂件⽰例
图2
说到qss的语法,我这⼉给出⼀个qss的坑:当类属性发现变化时需要重置qss,博⽂中也有相应的说明,虽然这篇博客是我转的,但是其中有加⼊我⾃⼰的理解。

关于qss风格重置我写了⼀下共有⽅法
1void 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⼀样
如果您觉得⽂章不错,不妨给个打赏,写作不易,感谢各位的⽀持。

您的⽀持是我最⼤的动⼒,谢谢
很重要--转载声明
1. 本站⽂章⽆特别说明,皆为原创,版权所有,转载时请⽤链接的⽅式,给出原⽂出处。

同时写上原作者: or
2. 如要转载,请原⽂转载,如在转载时修改本⽂,请事先告知,谢绝在转载时通过修改本⽂达到有利于转载者的⽬的。

相关文档
最新文档