概述
- 像现在市面上有很多软件都有换肤功能,例如:QQ、360、迅雷等。换肤其实很简单,并没有想象中那么难,下面介绍两种实现换肤的方式,仅供参考!
方式一
1. 实现原理
QFile file(":/qss/black.qss");
file.open(QFile::ReadOnly);
QString styleSheet = QLatin1String(file.readAll());
qApp->setStyleSheet(styleSheet);
file.close();
//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;
}
方式二
1. 实现原理
//注意:颜色值的划分可按照重要色、强调色、普通色及不可编辑色等类型进行划分。
<?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中的字体、背景颜色值,与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;
}
}