Qt之QSS(Q_PROPERTY-自定义属性)

简述

Qt之QSS(Q_PROPERTY-原始属性)一节我们分享了Q_PROPERTY-原始属性的用法,但通常情况下我们需要很多自定义样式,例如:动态获取QSS样式,这时自定义属性就能很好的发挥其用武之地了

问题

在使用QAbstractItemModel、QAbstractItemDelegate更新表格样式的时候,比如:背景色、前景色等,我们通常的做法是定义一些颜色常量,然后根据不同的条件显示不同的颜色,要么就是通过QSS全局设置,让所有的背景色、前景色保持一致。

这有一个问题,局限性太强,无法动态获取颜色值,大大降低了程序的扩展性。

解决方案

QAbstractItemModel、QAbstractItemDelegate均继承自QObject,而QSS只能用于QWidget及其子孙类,那么,如何动态获取样式属性值呢?

三部曲:

  • 创建一个从QWidget继承的专用类StyledWidget。
  • 为StyledWidget添加自定义属性,并使用Q_PROPERTY声明
  • 自定义QSS,使用自定义属性,语法:qproperty-<property name>

其中,Q_PROPERTY声明有以下要求:

  • READ getFunction 
    用于读取属性,使用const限定,返回属性的类型或者类型的指针或引用。

  • WRITE setFunction 
    用于设置属性,参数是一个属性的类型,或者属性的const指针或引用,返回

实例

效果

这里写图片描述

源码

创建一个从QWidget继承的专用类StyledWidget,为其添加自定义属性,并使用Q_PROPERTY声明:

StyledWidget.h

#ifndef STYLED_WIDGET
#define STYLED_WIDGET

#include <QWidget>

class StyledWidget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QColor normalColor READ normalColor WRITE setNormalColor DESIGNABLE true)
    ...
public:
    explicit StyledWidget(QWidget *parent = 0);
    ~StyledWidget();

    QColor normalColor() const;
    void setNormalColor(QColor color);
    ...

private:
    QColor m_normalColor;
    ...
};

#endif // STYLED_WIDGET

StyledWidget.cpp

...
QColor StyledWidget::normalColor() const
{
    return m_normalColor;
}

void StyledWidget::setNormalColor(QColor color)
{
    m_normalColor = color;
}
...

QSS

QSS中使用自定义的属性设置对应的样式:

StyledWidget {
        qproperty-normalColor: white;
        qproperty-disableColor: gray;
        qproperty-highlightColor: rgb(0, 160, 230);
        qproperty-errorColor: red;
}

使用

在需要设置样式的类中声明StyledWidget:

class TableModel : public QAbstractTableModel
{
    Q_OBJECT

public:
    ...
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    ...
private:
    ...
    StyledWidget m_styledWidget;
};

使用自定义属性设置样式:

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    switch (role)
    {
    case Qt::TextColorRole:
    {
        if (index.column() == FILE_NAME_COLUMN)
            return m_styledWidget.normalColor();

        if (index.column() == SIZE_COLUMN)
            return m_styledWidget.highlightColor();

        if (index.column() == STATUS_COLUMN)
            return m_styledWidget.errorColor();
    }
    ...
    }
    return QVariant();
}

源博客地址:http://blog.csdn.net/liang19890820/article/details/51699229#qss
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值