PC客户端换肤解决方案(Qt)

1 Qt样式表

QSS称为Qt Style Sheets也就是Qt样式表,它是Qt提供的一种用来自定义控件外观的机制。QSS大量参考了CSS的内容,只不过QSS的功能比CSS要弱很多,体现在选择器要少,可以使用的QSS属性也要少很多,并且并不是所有的属性都可以用在Qt的所有控件上。

注意:QSS会对各种控件提供不同的样式表支持,对于特殊的样式,可以利用筛选器配合Qt控件代码中的ObjectName,对其进行筛选,当然ObjectName可以多个控件都叫一个名称,QSS会将名称一样的设置为一样的样式,若未进行筛选,则样式表则对界面上所有的控件统一设置相同的样式。                   

2 换肤方案设计

针对白天黄昏黑夜,三种皮肤,建立三个样式表文件,每一个样式表文件对应一种皮肤,在点击切换皮肤时,则切换到对应的样式表文件即可,在写样式表文件时,要有一个相对的规范,不能乱写,按照窗口的顺序从上向下来写,如果需要修改某个窗口的样式,则找到对应的窗口在样式表中的位置即可。如下所示,不同界面的QSS以/**********************  *******************/这样的形式分割,便于后续查找以及维护。

示例
/***************************************
* 作者:YYC
* 日期:2020-04-26
* 功能:所有界面的样式表,用于美化界面
***************************************/
 
/********************** TitleBar Style Sheet  *******************/
QFrame#frameTitle
{
background-color:#19617C;
color:white;
}
 
QLabel#labelUtc
{
font-family: PingFangSC-Regular;
font-size: 16px;
color: #FFFFFF;
border: 1px solid #04CBDF;
}
 
/********************** Slider Angel Style Sheet  *******************/
 
QFrame#frameSlider
{
border-image:url(:/res/image/slider.png);
}
 
QPushButton#pushButtonLeft
{
border-image:url(:/res/image/left_arrow_normal.png);
}
 
QPushButton#pushButtonLeft:hover
{
border-image:url(:/res/image/left_arrow_hover.png);
}
 
QPushButton#pushButtonLeft:pressed
{
border-image:url(:/res/image/left_arrow_pressed.png);
}

3 实际应用

针对换肤,下面写了一个单例类,可以全局使用直接调用switchStyle接口,指定相对应的枚举即可,在以后的开发中只需要更改对应的样式表文件即可,无需修改代码。

// 头文件
#ifndef STYLESINGLETON_H
#define STYLESINGLETON_H
 
#include <QObject>
#include <QMutex>
#include <QMap>
 
class StyleSingleton : public QObject
{
    Q_OBJECT
public:
    enum StyleType
    {
        DAY_STYLE,
        DUSK_STYLE,
        NIGHT_STYLE,
 
        MAX_STYLE,
    };
    static StyleSingleton *getInstance();
    bool switchStyle(StyleType styleType);
private:
    explicit StyleSingleton(QObject *parent = nullptr);
    void initValue();
    bool loadStyleSheet(const QString &styleFilePath);
private:
    static QMutex m_mutex;
    QMap<StyleType, QString> m_mapStyle;
};
 
#endif // STYLESINGLETON_H

// 源文件
#include "stylesingleton.h"
#include <QFile>
#include <QApplication>
 
QMutex StyleSingleton::m_mutex;
 
StyleSingleton::StyleSingleton(QObject *parent) : QObject(parent)
{
    this->initValue();
}
 
void StyleSingleton::initValue()
{
    m_mapStyle[DAY_STYLE] = ":/style/day.qss";
    m_mapStyle[DUSK_STYLE] = ":/style/dusk.qss";
    m_mapStyle[NIGHT_STYLE] = ":/style/night.qss";
}
 
StyleSingleton *StyleSingleton::getInstance()
{
    QMutexLocker mutexLocker(&m_mutex);
    static StyleSingleton instance;
    return &instance;
}
 
bool StyleSingleton::loadStyleSheet(const QString &styleFilePath)
{
    QFile file(styleFilePath);
    file.open(QFile::ReadOnly);
    if(file.isOpen())
    {
        qApp->setStyleSheet(file.readAll());
        file.close();
        return true;
    }
    return false;
}
 
bool StyleSingleton::switchStyle(StyleType styleType)
{
    if (!m_mapStyle.contains(styleType)) return false;
 
    return this->loadStyleSheet(m_mapStyle.value(styleType));
}


// 调用
StyleSingleton::getInstance()->switchStyle(StyleSingleton::NIGHT_STYLE);

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值