QtTablewidget QAbstractltem Delegate 之 QSS攻略

引言

在Qt开发中,QTableWidget是一个常用的控件,用于显示表格数据。通过使用样式表(QSS),我们可以方便地为QTableWidget及其子项设置各种样式。本文将详细介绍如何使用QSS为QTableWidget设置样式,并通过示例代码展示如何实现这些功能。

在使用QAbstractltem Model、Deletegate更新样式表的时候不能用来动态的扩展,只能通过一些不同的变量来显示不同的颜色,这样修改起来很麻烦,通过QSS修改有全行全表格进行设置局限性太强,无法动态获取颜色值,

因为QAbstractltemModel、QAbstractItemDelegate均继承自QObject,而qss只能用于QWidget及其子孙类 QWidgetItem没有setProperty设置动态属性的接口 在QTabelWidget不能一个单元格一个单元格进行动态设置大大降低可扩展性

解决方案:

可以通过以下几个方案进行动态绑定

为了动态获取和应用样式,我们创建一个继承自QWidget的自定义类StyledWidget,并为其添加自定义属性。

这些属性将通过Q_PROPERTY声明,使得我们可以在QSS中进行设置

自定义QSS,使用自定义属性,语法:qproperty-<property name>

举例说明 property name    变量名basketballColor

StyledWidget {
    qproperty-basketballColor: red;
}

代码中的应用

//头文件
 Q_OBJECT
    Q_PROPERTY(QColor basketballColor READ basketballColor WRITE setBasketballColor DESIGNABLE true)


  QColor basketballColor() const;
    void setBasketballColor(QColor color);

private:
    QColor m_basketballColor;

// cpp

// 获取和设置篮球颜色
QColor StyledWidget::basketballColor() const
{
    return m_basketballColor;
}

void StyledWidget::setBasketballColor(QColor color)
{
    m_basketballColor = color;
    update();
}

效果实例如下

具体代码如下:

1 styledwidget.h

#ifndef STYLED_WIDGET_H
#define STYLED_WIDGET_H

#include <QWidget>
#include <QColor>

class StyledWidget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QColor basketballColor READ basketballColor WRITE setBasketballColor DESIGNABLE true)
    Q_PROPERTY(QColor footballColor READ footballColor WRITE setFootballColor DESIGNABLE true)
    Q_PROPERTY(QColor pingpongColor READ pingpongColor WRITE setPingpongColor DESIGNABLE true)
    Q_PROPERTY(QString basketballIcon READ basketballIcon WRITE setBasketballIcon DESIGNABLE true)
    Q_PROPERTY(QString footballIcon READ footballIcon WRITE setFootballIcon DESIGNABLE true)
    Q_PROPERTY(QString pingpongIcon READ pingpongIcon WRITE setPingpongIcon DESIGNABLE true)

public:
    explicit StyledWidget(QWidget *parent = nullptr);
    ~StyledWidget();

    QColor basketballColor() const;
    void setBasketballColor(QColor color);

    QColor footballColor() const;
    void setFootballColor(QColor color);

    QColor pingpongColor() const;
    void setPingpongColor(QColor color);

    QString basketballIcon() const;
    void setBasketballIcon(const QString &iconPath);

    QString footballIcon() const;
    void setFootballIcon(const QString &iconPath);

    QString pingpongIcon() const;
    void setPingpongIcon(const QString &iconPath);

private:
    QColor m_basketballColor;
    QColor m_footballColor;
    QColor m_pingpongColor;
    QString m_basketballIcon;
    QString m_footballIcon;
    QString m_pingpongIcon;
};

#endif // STYLED_WIDGET_H

2 styledwidget.cpp

#include "styledwidget.h"

// 构造函数初始化颜色和图标路径
StyledWidget::StyledWidget(QWidget *parent)
    : QWidget(parent),
      m_basketballColor(Qt::red),
      m_footballColor(Qt::green),
      m_pingpongColor(Qt::blue),
      m_basketballIcon(":/data/basketball.png"),
      m_footballIcon(":/data/football.png"),
      m_pingpongIcon(":/data/pingpong.png")
{
}

StyledWidget::~StyledWidget()
{
}

// 获取和设置篮球颜色
QColor StyledWidget::basketballColor() const
{
    return m_basketballColor;
}

void StyledWidget::setBasketballColor(QColor color)
{
    m_basketballColor = color;
    update();
}

// 获取和设置足球颜色
QColor StyledWidget::footballColor() const
{
    return m_footballColor;
}

void StyledWidget::setFootballColor(QColor color)
{
    m_footballColor = color;
    update();
}

// 获取和设置乒乓球颜色
QColor StyledWidget::pingpongColor() const
{
    return m_pingpongColor;
}

void StyledWidget::setPingpongColor(QColor color)
{
    m_pingpongColor = color;
    update();
}

// 获取和设置篮球图标路径
QString StyledWidget::basketballIcon() const
{
    return m_basketballIcon;
}

void StyledWidget::setBasketballIcon(const QString &iconPath)
{
    m_basketballIcon = iconPath;
    update();
}

// 获取和设置足球图标路径
QString StyledWidget::footballIcon() const
{
    return m_footballIcon;
}

void StyledWidget::setFootballIcon(const QString &iconPath)
{
    m_footballIcon = iconPath;
    update();
}

// 获取和设置乒乓球图标路径
QString StyledWidget::pingpongIcon() const
{
    return m_pingpongIcon;
}

void StyledWidget::setPingpongIcon(const QString &iconPath)
{
    m_pingpongIcon = iconPath;
    update();
}

3. 定义样式表

我们在styles.qss文件中定义样式,包括自定义属性的设置:

styles.qss

QLineEdit[status='Normal'] {
    border: 1px solid #CCCCCC;
}

QLineEdit[status='Warning'] {
    border: 1px solid #FF3E33;
}

StyledWidget {
    qproperty-basketballColor: red;
    qproperty-footballColor: green;
    qproperty-pingpongColor: blue;
    qproperty-basketballIcon: url(:/data/basketball.png);
    qproperty-footballIcon: url(:/data/football.png);
    qproperty-pingpongIcon: url(:/data/pingpong.png);
}

具体代码可查看仓库 DrawColor_Icon_tablewidget

https://gitee.com/myqtproject/my-table-widget.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值