玩转Qt样式表

抛出问题:怎么才能使用样式表。
Qt style类似于CSS,使用方法。
菜鸟:
(1)直接用Qt的设计师填写相关样式,不在过多阐述。
(2)setStyleSheet(“”)这个函数可以设置样式表

setStyleSheet 注意事项:样式表一行写不下可以这样写。使用这个函数之前的样式就已经覆盖。

this->setStyleSheet("QPushButton{color:#FFFFFF;}"
					"QPushButton:hover{color:red;}"
					"")

使用这个函数设置时最方便的,但是代码里面写的多了,就跟屎一样。
因此,高级使用方法,如下:
(1)中级:通过Qt的属性来控制样式的使用,就可以不同在代码中使用sheStylesheet了,直接设置属性值,sheProperty,根据属性值直接就自动使用该值的样式,方法如下
样式表中声明QtoolButton的悬浮状态,TQToolButtonOpen你可以把他理解为key值,true为状态值。

QToolButton:hover[TQToolButtonOpen="true"]{
background-color:#0279D0;
}
QToolButton:hover[TQToolButtonOpen="false"]{
background-color:red;
}

代码中使用;这样就能设置状态为false的样式,

toolBtn->setProperty("TQToolButtonOpen",QVariant(false));
如果设置了不起作用,可以尝试使用
this->style()->unpolish(this);
this->style()->polish(this);

(2)大神级别使用场景,你需要放置一个按钮来设置全部界面样式的切换,怎么做。
思路:qss读取时本来就相当于一个QString,直接放到setStyleSheet中,只要我们每次按钮切换,重新拼接QString的qss,重新setstylesheet中,就能达到点击按钮直接切换全部样式的效果,但是这个多字符串怎么拼接。
方法:在样式表中

QMainWindow {
     background-color:%BackgroundColor%;
    color:%FontColor%;}

可以把%BackgroundColor%理解为占位符,bat脚本中,变量就是这么使用的。
然后代码:Q_PROPERTY Qt 最牛的地方

#define TT_PROPERTY(type, name)\
    Q_PROPERTY(type name MEMBER name)\
    type name
class  StyleParam : public QObject
{
    Q_OBJECT
public:
    virtual ~StyleParam() = default;
    TT_PROPERTY(QString,   FontColor);
    TT_PROPERTY(QString,   BackgroundColor);

    TT_PROPERTY(int,          TabBorderRadius);
    TT_PROPERTY(int,          TabSpacing);

    bool                      UseTemplateSheet;
    QString                   AdditionalStyleSheet;
};
#undef TT_PROPERTY

extern  const QString g_styleKool;
extern  const QString g_styleVienna;
extern  const QString g_styleThreshold;

}
Q_DECLARE_METATYPE(sm::Colors)

#endif // STYLE_H

全部工作已经准备好了 ,可以使用了,制造setstylesheet使用的QString

static void QSSFillStyle(QString& style, const sm::StyleParam& params)
{
    style.clear();
    if(params.UseTemplateSheet)
        style = GetStyleTemplate();
        //核心代码
    int numProps = params.metaObject()->propertyCount();
    for(int i=0; i<numProps; i++)
    {
    //核心
        const QMetaProperty prop = params.metaObject()->property(i);
        if(QString(prop.name()) == "objectName")
            continue;
        if(prop.type() == QVariant::Bool)
            continue;
        const QString propStr = QString("%") + prop.name() + "%";
        if(!style.contains(propStr))
            continue;
            //巧妙替换所有变量,重新拼接字符串
        style.replace(propStr, "%1");

        const QVariant property = params.property(prop.name());
        switch(prop.type())
        {
            case QVariant::String:
                style = style.arg(property.toString());
                break;
            case QVariant::Int:
                style = style.arg(property.toInt());
                break;
            case QVariant::UserType:
            {
                style = style.arg(property.toString());
                break;
            }
            default:
             break;
        }
    }
//最后就把样式正确的拼接成字符串就可以正常使用了
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风赤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值