概述

  • 像现在市面上有很多软件都有换肤功能,例如: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之界面换肤的两种方式相关推荐

  1. Qt Qml动态创建对象/组件的两种方式

    Qml动态创建对象有两种方式: a.使用Loader b.使用javaScript 1.Loader加载机制: 加载过程: 通过source,来加载qml文件. 通过sourceComponent,来 ...

  2. Qt之界面换肤【转】

    简述 实现原理 效果 新建QSS文件 编写QSS代码 加载QSS 更多参考 简述 常用的软件基本都有换肤功能,例如:QQ.360.迅雷等.换肤其实很简单,并没有想象中那么难,利用前面分享过的QSS系列 ...

  3. Android欢迎界面延迟跳转两种方式

     public class MainActivity extends Activity { @Override     protected void onCreate(Bundle savedIn ...

  4. Qt导出数据到EXCEL的两种方式

    一.导出到csv格式,这种格式不用安装office QString DModel::exportDataToCSV(QString lx) {QString dtStr="d:/" ...

  5. linux服务器 远程桌面,Linux 远程桌面的两种方式

    在绝多数情况下,Linux 不需要使用到GUI的桌面环境,但是有时在一些特殊的场景如安装Oracle的时候,需要有图形界面进行辅助才可以安装. 如果要使用Linux的图形界面,一般有两种方式: 1.L ...

  6. linux远程桌面方式,Linux 远程桌面的两种方式

    在绝多数情况下,Linux 不需要使用到GUI的桌面环境,但是有时在一些特殊的场景如安装Oracle的时候,需要有图形界面进行辅助才可以安装. 如果要使用Linux的图形界面,一般有两种方式: 1.L ...

  7. QT自定义精美换肤界面

    QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...

  8. 【QT学习】QSS样式表实现界面换肤(图文详解+源码)

    文章目录 前言 一.实现效果 二.QSS简介及用法 1.什么是QSS? 2.怎么使用QSS? 三.QSS用法一:单个控件调用setStyleSheet函数 四.QSS用法二:编写单个界面.qss文件的 ...

  9. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

最新文章

  1. 科大星云诗社动态20210905
  2. 关于java.math.BigDecimal的操作(亲测)
  3. 1.Swift教程翻译系列——关于Swift
  4. EF+postgresql中的一些问题
  5. 2010软考软件设计师冲刺精选【专家压轴模拟•下】
  6. 用tsmmc.MSC方式在xp和Win7集中管理多台Win2003服务器
  7. Shamir密钥分享算法 python实现
  8. 丁香医生APP被App Store拒绝更新:违反苹果内购系统规定
  9. linux中的权限管理,Linux中的用户和权限管理
  10. JDK5.0的11个主要新特征
  11. 4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!
  12. 毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统
  13. 2022年山东省安全员B证考试练习题及在线模拟考试
  14. ElementUI 日期组件在IE下数据无法正常显示
  15. 14. Zigbee应用程序框架开发指南 - 睡眠设备
  16. mysql - rank函数的使用
  17. wordpress 瀑布流ajax,WordPress瀑布流主题:蛋花儿Free版
  18. 拉依达准则的python代码
  19. java键盘录的使用方法
  20. Python通过MQTT协议上传物联网数据给ThingsBoard

热门文章

  1. 【图像融合】梯度域中的多曝光多焦点图像融合算法研究附matlab代码
  2. Word怎样操作在文本添加形态图标?技巧经验!Word如何进入形状标识?
  3. Linux 守门员:防火墙iptables
  4. linux mount函数,mount / unmount 函数
  5. https服务IE可以访问,而GOOGLE无法访问
  6. paste shell 分隔符_shell命令--paste
  7. UVCCamera gradle配置
  8. leetcode 670. 最大交换 python
  9. 客户倒逼!F-One如何2C和2B双模式齐下?
  10. 详解Linux双网卡绑定之bond0