天天看点

QT换肤解决方案QT皮肤开发介绍:文件的规范性:QSS的一些细节:皮肤文件的管理

昨天写了篇自己学习感受的博客,竟然有人留言,受此鼓励,趁今天是周末,在写一篇技术性文档,但是又不知道写什么话题,真的是只有在写东西时候,才会知道自己大脑中的这些东西是要整理的,好了废话不说了,由于这是第一次发技术性文档,在此声明下,如果有朋友在阅读中,发下了错误,或者有好的方法,可以联系交流。

大家好,我是tank,那个来自山里的程序员,今天聊下QT开发皮肤的一些问题,知识杂碎,就说到哪里算哪里吧,望体谅。

开发环境:windows

开发语言:QT5.9+VS2015

主题:QT换肤解决方案

QT皮肤开发介绍:

开发过QT程序的可能都清楚,QT程序的UI使用起来是很简单的,可以是用QT Designer开发,也可以使用直接写UI代码开发,两种的好处,自己感觉都挺好的,但是无论使用哪一种,要正确使用,特别是在混合使用时候,一定要注意,布局的一些细节,UI的一些细节都可能会最终影响你的交互,

先说个例子,刚接触QT时候,开发使用了Designer,然后在代码中也实现了一个函数,明明是绑定A按钮,但是就是不清楚为什么会在触发B按钮时候也会回执行到这里,后来才清楚是命名的原因,on_对象名_信号();这样的写法是不需要绑定信号的,还有一些边距的问题,有的是在代码中写了setMargin(),在设计器中也设计了,导致以为不起作用。还有一些QT的UI样式,有的在designer 中写,有的在代码中使用setstylSheet();有的人写在QSS中,总之,很乱,当更换皮肤时候,才发现有很多小的UI样式,修改起来不知道去哪找,下面我就说下整理我自己觉得比较合适的皮肤开发维护的思路。

第一步,选择合适的统一的使用皮肤样式的方法,

1.直接使用QSS 和图片;在代码中对QSS文件进行加载,图片放在QT项目中的Resource文件加下。

void setStyle(const QString &style) 
{
    QFile qss(style);
    qss.open(QFile::ReadOnly);
    qApp->setStyleSheet(qss.readAll());
    qss.close();
}
           

代码中通过读取QSS文件即可显示,可以对不同模块设计QSS文件,然后在模块动态加载时候加载QSS显示。

2.使用RCC 形式,创建QRC文件,通过编译生成RCC文件,在代码中加载注册加载rcc文件即可。

//RCC文件生成:
rcc.exe -binary 文件名.qrc -o QtLoadRcc.rcc

//RCC文件加载:
QResource::registerResource("文件名.rcc");

//RCC文件卸载
QResource::unregisterResource("文件名.rcc");
           

文件的规范性:

QSS文件写法和CSS文件写法大致相同,但是具体内容的实现还是有多中写法,图片的格式也要统一,使用svg格式还是png格式,尽量统一。

我们的项目使用的是RCC这种形式的,不好之处就是修改皮肤后,总要编译后才可以看到效果,确实不是很方便,但是这样对于UI的管理还是挺好,最终一个rcc文件就可以了。

样式一定要统一卸载一个地方,QSS文件还是代码中,不要分散,一个QSS文件写一个模块,不要写在一起,防止书写错误,这样错误对于新手,查原因都需要很长时间,就是不知道为什么有些UI的样式显示出来了。有些没有加载出来,很有可能是你的QSS文件中有写错的地方。不要在QSS中写了样式,在代码中也设置也样式,防止样式无效,特别是在父对象设置了样式,子对象设置时候一定要注意,不然又莫名的不显示样式了,

QSS的一些细节:

1.全局写在前,有主题颜色的,全局的样式,一定写全局样式,不要一个个设置。

2.image的背景图片的设置,选用background-image 还是border-image;还是image;一定要适合自己情况,不然总是说图标变形。

3.对于边框的样式,能够一行设计的不要用三行。

4.对于一些通过状态改变的UI,设置属性去解决,不要写在代码里,见得最多的就是这种写法,比如,当A时候设置样式为红色,当!A时候设置样式为黑色,要善于使用动态属性。

void setQss(bool isQss)
{
	isQss ? label->setProperty("labelStatus", "11"): label->setProperty("labelStatus", "22");

	label->style()->unpolish(label);
	label->style()->polish(label);
	label->update();
}
           

5.对绝对位置和相对位置加载图片要有所了解。

等,很多细节想不起来了,遇到了自行百度吧,

皮肤文件的管理

皮肤文件生成好后,本地保存多个皮肤文件还是存放在文件服务,在用户切换时候下载更新,这两种方式都可以。

我们最近项目,采用的是皮肤文件存放在服务端,因为我们的要求是可以换肤就行,并不是给用户切换皮肤,所以放在了服务端,如果你的程序就是为了给用户提供一种切换皮肤的功能体验,你也可以将文件保留在本地,这样起码速度还是挺快的。

至于我们的皮肤文件版本怎么维护?文件怎么更新?以及我们程序开发中的更新模块,日志管理模块,组件式开发问题,这些有时间在分享出来,今天就写到这里。

关于QT的学习,有趣的问题我有时间会总结在这里,因为我发现学习有几个过程,复制,学习,使用,理解,总结,没有总结可能很快你学的东西就又还给了教你的那个人,因此我要好好学习。 争取做一个牛逼的程序员,而不是码农。

继续阅读