Qt之界面换肤的两种方式
概述
- 像现在市面上有很多软件都有换肤功能,例如:QQ、360、迅雷等。换肤其实很简单,并没有想象中那么难,下面介绍两种实现换肤的方式,仅供参考!
方式一
1. 实现原理
- 创建多个QSS文件
首先,根据界面不同的版式创建多个QSS文件,例如,black.qss,blackblue.qss,gray.qss等,将其加入资源文件。Qt样式表的动态加载如下:
QFile file(":/qss/black.qss");
file.open(QFile::ReadOnly);
QString styleSheet = QLatin1String(file.readAll());
qApp->setStyleSheet(styleSheet);
file.close();
- 每一个QSS文件编写对应控件的样式
//QMenu样式(black.qss)
QMenu::item
{background-color: #333333;padding: 5px 10px 5px 10px;margin:5px 5px 10px 10px;
}QMenu::item:disabled
{color: #666666;
}QMenu::item:selected
{background: #333333;color: #FEFEFE;border: 1px solid transparent;
}QMenu::separator
{height: 1px;background: transparent;margin: 10px 1px 10px 1px;
}QMenu::indicator
{width: 13px;height: 13px;
}
- 界面换肤时,进行切换
界面上可以通过不同的按钮进行加载不同的QSS文件,以此达到换肤功能。
方式二
1. 实现原理
- 创建一个QSS文件
首先,创建一个后缀名为QSS文件,例如style.qss,将其加载到资源文件中(qrc)。 - 生成格式文件(文件类型可以是xml,也可以是json格式)
然后,手动创建一个用于保存界面中控件的颜色值的文件,例如customcolor.xml,该xml文件格式可以自己设计,方便加载和解析。以下给出customcolor.xml的格式,仅供参考。
//注意:颜色值的划分可按照重要色、强调色、普通色及不可编辑色等类型进行划分。
<?xml version="1.0" encoding="utf-8"?>
<!-- QApplication Color -->
<StyleColor><!-- 字体颜色 --><ColorItem name="fontcolor" value="#cccccc"></ColorItem><!-- 边框颜色 --><ColorItem name="bordercolor" value="#cccccc"></ColorItem><!-- 普通控件颜色 --><ColorItem name="normalcolor" value="#cccccc"></ColorItem><!-- 普通控件hover颜色 --><ColorItem name="hovercolor" value="#6699cc"></ColorItem><!-- 普通控件press颜色 --><ColorItem name="presscolor" value="#333333"></ColorItem>
</note>
- 替换QSS文件中的颜色值
//修改QSS中的字体、背景颜色值,与customcolor.xml文件对应起来
QPushButton#login_btn
{border-width:1px;border-style: style;border-color: %bordercolor%;border-radius: 3px;color: %fontcolor%;background: %normalcolor%;
}
QPushButton#login_btn::hover
{background: %hovercolor%;
}
QPushButton#login_btn::pressed
{background: %presscolor%;
}
- 加载并解析格式文件,进行界面换肤
//加载QSS文件
QFile qssfile(":/themes/style");
QString qss;
UpdateThemeFile(qssfile);
AnalysisQssFile(qssfile, qss);
this->setStyleSheet(qss);//解析customcolor.xml文件
//DOC解析xml需要添加对应头文件
QMap<QString, QString> ColorMaps;
void UpdateThemeFile(QString& qssfile)
{QString filepath = QApplication::applicationDirPath() + "/customcolor.xml";QFile file(filepath);if(!file.open(QIODevice::ReadOnly)){return; }QDocument docment;bool isok = docment.setContent(&file);if(!isok){file.close();return;}file.close();QDocment root = docment.docmentElement();QDomNode node = root.firstChild();while(!node.isNull()){if(node.isElement()){QDomElement firstele = node.toElement();QDomNodeList nodelist = firstele.childNodes();for(int i=0;i<nodelist.count();++i){if(nodelist.at(i).isElement()){QDomElement coloritem = nodelist.at(i).toElement();QString strname = coloritem.attribute("name");QString strvalue = coloritem.attribute("value"); ColorMaps.insert(strname, strvalue);} }}node = node.nextSibling();//读取}
}void AnalysisQssFile(QString qssfile, QString& qssstr)
{ if(ColorMaps.count() > 0 && qssfile.open(QIODevice::ReadOnly)){QByteArray bytes = qssfile.readAll();QMap<QString,QString>::iterator iter = ColorMaps.begin();for(; iter != ColorMaps.end(); ++iter){QString repname = "%" + iter.key() + "%"; bytes.replace(repname, iter.value().toUtf8());}qssstr = bytes;}
}
Qt之界面换肤的两种方式相关推荐
- Qt Qml动态创建对象/组件的两种方式
Qml动态创建对象有两种方式: a.使用Loader b.使用javaScript 1.Loader加载机制: 加载过程: 通过source,来加载qml文件. 通过sourceComponent,来 ...
- Qt之界面换肤【转】
简述 实现原理 效果 新建QSS文件 编写QSS代码 加载QSS 更多参考 简述 常用的软件基本都有换肤功能,例如:QQ.360.迅雷等.换肤其实很简单,并没有想象中那么难,利用前面分享过的QSS系列 ...
- Android欢迎界面延迟跳转两种方式
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedIn ...
- Qt导出数据到EXCEL的两种方式
一.导出到csv格式,这种格式不用安装office QString DModel::exportDataToCSV(QString lx) {QString dtStr="d:/" ...
- linux服务器 远程桌面,Linux 远程桌面的两种方式
在绝多数情况下,Linux 不需要使用到GUI的桌面环境,但是有时在一些特殊的场景如安装Oracle的时候,需要有图形界面进行辅助才可以安装. 如果要使用Linux的图形界面,一般有两种方式: 1.L ...
- linux远程桌面方式,Linux 远程桌面的两种方式
在绝多数情况下,Linux 不需要使用到GUI的桌面环境,但是有时在一些特殊的场景如安装Oracle的时候,需要有图形界面进行辅助才可以安装. 如果要使用Linux的图形界面,一般有两种方式: 1.L ...
- QT自定义精美换肤界面
QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...
- 【QT学习】QSS样式表实现界面换肤(图文详解+源码)
文章目录 前言 一.实现效果 二.QSS简介及用法 1.什么是QSS? 2.怎么使用QSS? 三.QSS用法一:单个控件调用setStyleSheet函数 四.QSS用法二:编写单个界面.qss文件的 ...
- Qt编写可换肤的中文双拼汉字输入法
时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...
最新文章
- 科大星云诗社动态20210905
- 关于java.math.BigDecimal的操作(亲测)
- 1.Swift教程翻译系列——关于Swift
- EF+postgresql中的一些问题
- 2010软考软件设计师冲刺精选【专家压轴模拟•下】
- 用tsmmc.MSC方式在xp和Win7集中管理多台Win2003服务器
- Shamir密钥分享算法 python实现
- 丁香医生APP被App Store拒绝更新:违反苹果内购系统规定
- linux中的权限管理,Linux中的用户和权限管理
- JDK5.0的11个主要新特征
- 4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!
- 毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统
- 2022年山东省安全员B证考试练习题及在线模拟考试
- ElementUI 日期组件在IE下数据无法正常显示
- 14.	Zigbee应用程序框架开发指南 - 睡眠设备
- mysql - rank函数的使用
- wordpress 瀑布流ajax,WordPress瀑布流主题:蛋花儿Free版
- 拉依达准则的python代码
- java键盘录的使用方法
- Python通过MQTT协议上传物联网数据给ThingsBoard