Qss自定义属性

QSS自定义属性

更多精彩内容
👉个人内容分类汇总 👈
👉QSS样式学习 👈

前言

  • Qss内置了许多的伪状态可以用于设置控件的样式动态变化(例如::checked:hover),但在日常开发中为了更加灵活的样式,这些伪状态就不够用了;
  • 将QObject中的属性功能与Qss结合使用就会发现不一样的风景,主要有4种用法;
    1. 使用Qss属性选择器设置通过【Q_PROPERTY】定义的属性的样式,当属性状态改变后控件样式跟着改变;
    2. 使用Qss属性选择器设置通过【setProperty()】定义的动态属性的样式,当属性状态改变后控件样式跟着改变;
    3. 使用 【qproperty-<属性名称>】语法设置通过Q_PROPERTY定义的属性的值;
    4. 定义一个枚举,使用Q_ENUM或者Q_ENUMS注册枚举类型,使用Q_PROPERTY定义一个已注册的枚举类型的属性,可以通过【qproperty-<属性名称>:枚举名称】方式设置属性的值。
  • 在代码中不再是将样式表放在资源文件中,而是放到可执行程序路径下,可定制性更强。

一、实现效果

在这里插入图片描述

二、使用方式

1.QSS设置Q_PROPERTY属性样式

  1. 在继承于QWidget的类中Q_OBJECT后,私有区域使用Q_PROPERTY定义一个属性;

    Q_PROPERTY(bool checked READ isChecked WRITE setChecked)
    
  2. 在类中分别定义属性对应的变量、函数;

    在这里插入图片描述

  3. 使用QSS属性选择器设置对应的样式,[属性名=属性值]

    /* 设置Q_PROPERTY定义的属性样式 */
    #Widget[checked = true] {
        background-color: rgb(0, 255, 127);
    }
    
  4. 在程序中修改属性值后,样式不会发生变化,需要调用polish(控件) 刷新控件样式;

    this->style()->polish(this);
    

2.QSS设置动态属性样式

  1. 再Qss样式表中使用QSS属性选择器设置对应的样式,[属性名=属性值]

    /* 设置动态属性样式 */
    #Widget[property1 = true] {
        background-color: rgb(255, 0, 127);
    }
    
  2. 再程序中调用setProperty() 函数设置属性值,如果没有通过Q_PROPERTY定义属性,使用setProperty(“property1”, value)设置后会将property1添加为动态属性,并且返回false

    this->setProperty("property1", value)
    
  3. 在程序中修改动态属性值后,样式不会发生变化,需要调用polish(控件) 刷新控件样式;

    this->style()->polish(this); 
    

3.qproperty-<属性名称>语法1

  1. 在继承于QWidget的类中Q_OBJECT后,私有区域使用Q_PROPERTY定义一个属性;

    Q_PROPERTY(QColor BgColor READ isBgColor WRITE setBgColor)
    
  2. 在类中分别定义属性对应的变量、函数;

    在这里插入图片描述

  3. 在Qss样式表中使用 qproperty-<属性名称>语法设置属性的值。

    /* 通过Qss设置Q_PROPERTY定义的属性的值 */
    #Widget {
        qproperty-BgColor: rgb(255, 0, 0);
    }
    
  4. 由于在程序界面还没显示时样式表还没生效,所以在构造函数中时无法获取设置后的属性值,在程序启动并且显示后可以获取设置后的属性值。

    在这里插入图片描述

4.qproperty-<属性名称>语法2

  1. 在继承于QWidget的类中,公有区域定义一个枚举,并使用Q_ENUM或者Q_ENUMS向元对象系统注册枚举类型;

    在这里插入图片描述

  2. 使用Q_PROPERTY定义一个该枚举类型的属性;

    Q_PROPERTY(AgeEnum age READ age WRITE setAge)
    
  3. 在类中分别定义属性对应的变量、函数;

    在这里插入图片描述

  4. 在Qss样式表中使用 qproperty-<属性名称>语法设置属性的值,值为注册的枚举中的项,不能是数字。

    /* 通过Qss设置Q_PROPERTY定义的属性的值 */
    #Widget {
        qproperty-age: age3;                 /* 通过Q_ENUM注册的枚举修改自定义属性值*/
    }
    
  5. 在程序启动并且显示后可获取设置后的属性值;

    在这里插入图片描述

四、主要代码

  • widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
        Q_PROPERTY(bool checked READ isChecked WRITE setChecked)
        Q_PROPERTY(QColor BgColor READ isBgColor WRITE setBgColor)
        Q_PROPERTY(AgeEnum age READ age WRITE setAge)               // 想要通过Q_ENUM注册的枚举修改属性值,属性的类型就需要时【枚举的类型】,而不能是其它类型,例如int
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        enum AgeEnum {
            age1 = 10,
            age2 = 20,
            age3 = 30
        };
        Q_ENUM(AgeEnum)  // 向元对象系统注册枚举类型(可以使用Q_ENUM或者Q_ENUMS,不过后者已经过时)
    
        bool isChecked() const;
        void setChecked(bool value);
        QColor isBgColor() const;
        void setBgColor(QColor color);
        AgeEnum age() const;
        void setAge(AgeEnum value);
    
    private slots:
        void on_pushButton_clicked();
    
        void on_pushButton_2_clicked();
    
        void on_pushButton_3_clicked();
    
    private:
        void initStyle();
    
    private:
        Ui::Widget *ui;
    
        bool m_checked = false;
        QColor m_bgColor = QColor(255, 255, 255);
        AgeEnum m_age;
    };
    #endif // WIDGET_H
    
    
  • widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    
    #include <QFile>
    #include <QTextStream>
    #include <QDebug>
    #include <QStyle>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        initStyle();
    
    
        qDebug() << "在构造函数中获取属性值:" << m_bgColor.name();   // 无法获取到qss修改后的属性值
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    bool Widget::isChecked() const
    {
        return m_checked;
    }
    
    void Widget::setChecked(bool value)
    {
        m_checked = value;
    }
    
    QColor Widget::isBgColor() const
    {
        return m_bgColor;
    }
    
    void Widget::setBgColor(QColor color)
    {
        m_bgColor = color;
    }
    
    Widget::AgeEnum Widget::age() const
    {
        return m_age;
    }
    
    void Widget::setAge(AgeEnum value)
    {
        m_age = value;
    }
    
    /**
     * @brief 加载qss文件
     */
    void Widget::initStyle()
    {
        QString strFile = qApp->applicationDirPath() + "/style.css";   // 这里我没有使用资源文件,而是把样式表文件放在当前路径下,便于随时更换
        QFile file(strFile);
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream stream(&file);
    
            QString strQss;
            while (!stream.atEnd())
            {
                strQss.append(stream.readLine());
            }
            qApp->setStyleSheet(strQss);               // 设置整个程序的样式表而不是当前窗口
        }
        else
        {
            qWarning() << "打开qss文件失败!";
        }
    }
    
    /**
     * @brief 通过Q_PROPERTY定义的属性更新Qss样式
     *        设置属性的方式有两种
     *        方式一:setChecked
     *        方式二:setProperty("checked", value)  : 设置成功返回true,否则返回false
     */
    void Widget::on_pushButton_clicked()
    {
        this->setChecked(!this->isChecked());   // 更改控件的属性 【Q_PROPERTY】
        this->style()->polish(this);            // 属性值更改后重新初始化给定控件的样式。
    }
    
    /**
     * @brief 通过动态属性的方式更新QSS样式
     *        如果没有通过Q_PROPERTY定义属性,使用setProperty("property1", value)
     *        设置后会将property1添加为动态属性,并且返回false,
     *        效果和使用Q_PROPERTY定义的属性类似
     */
    void Widget::on_pushButton_2_clicked()
    {
        static bool value = true;
        qDebug() << this->setProperty("property1", value);   // 设置动态属性
        value = !value;
    
        this->style()->polish(this);                         // 属性值更改后重新初始化给定控件的样式。
    }
    
    /**
     * @brief 在Qss通过qproperty-属性 的方式修改属性的值,qproperty 语法只在程序启动显示控件是生效一次
     *        在构造函数中由于控件还没有开始显示,所以qproperty没生效,是无法获取修改后的属性值的,在窗口显示后就可以获取到属性值
     *        注意:虽然主要继承于QObject的类都可以通过Q_PROPERTY定义属性,但是只有继承于QWidget的类定义的属性可以通过Qss修改,
     *             因为QObject不包含QStyle
     */
    void Widget::on_pushButton_3_clicked()
    {
        qDebug() << "程序启动后获取属性值:" << m_bgColor.name();
        qDebug() <<"Qss设置的属性值:" << m_age;
    }
    
    
  • style.css

    /* 设置Q_PROPERTY定义的属性样式 */
    #Widget[checked = true] {
        background-color: rgb(0, 255, 127);
    }
    
    /* 设置动态属性样式 */
    #Widget[property1 = true] {
        background-color: rgb(255, 0, 127);
    }
    
    /* 通过Qss设置Q_PROPERTY定义的属性的值 */
    #Widget {
        qproperty-BgColor: rgb(255, 0, 0);
        qproperty-age: age3;                 /* 通过Q_ENUM注册的枚举修改自定义属性值*/
    }
    
    

五、源代码

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 在 qss 中设置自定义属性的方法如下: 1. 在 qss 文件中添加自定义属性的声明,例如: ``` QPushButton[customAttribute="value"] { /* Style rules go here */ } ``` 2. 在代码中为控件设置自定义属性,例如: ``` pushButton->setProperty("customAttribute", "value"); ``` 3. 在代码中应用 qss 样式表,例如: ``` pushButton->setStyleSheet(styleSheet); ``` 注意:自定义属性的名称必须以 "q_" 或 "Q_" 开头,否则无法在 qss 中使用。 ### 回答2: 在使用Qt编程时,可以使用QSSQt Style Sheets)来设置控件的样式和外观。要给控件设置自定义属性,可以按照以下步骤操作: 首先,在代码中创建一个派生自QWidget或其子类的自定义控件,例如MyWidget。 然后,在MyWidget类的头文件中定义一个成员变量作为自定义属性,例如myProperty。 接下来,在MyWidget类的实现文件中提供一个getter和setter方法来访问和修改这个自定义属性。 再次,在QSS中使用选择器来选择需要设置自定义属性的控件,例如具有自定义属性的MyWidget实例,可以通过选择器“MyWidget[myProperty="value"]”来选择。 最后,在QSS中使用属性设置语法来设置自定义属性的值。例如,可以通过设置“myProperty: value;”来给控件设置自定义属性的值。 总结起来,要在QSS内给控件设置自定义属性,需要在代码中定义自定义控件,提供getter和setter方法来访问和修改自定义属性,然后在QSS中使用选择器和属性设置语法来设置自定义属性的值。这样在QSS中就可以通过选择器选择具有自定义属性的控件,并为它们设置相应的样式。 ### 回答3: 在Qt中,可以通过在QSS样式表内定义自定义属性来给控件设置自定义属性。下面是一个实现的示例: 首先,在Qt设计师中设计界面并添加一个控件,例如QPushButton。然后,选择该控件,右键单击选择"Go to slot...",选择"clicked()"信号的槽函数。 在生成的槽函数内,可以通过setProperty()函数给控件设置自定义属性。例如,设置一个自定义属性"myProperty"为"myValue": ```cpp void MainWindow::on_pushButton_clicked() { ui->pushButton->setProperty("myProperty", "myValue"); } ``` 接下来,在QSS样式表中,可以通过"["和"]"操作符定义自定义属性的样式。例如,设置属性"myProperty"为"myValue"的背景颜色为红色: ```qss QPushButton[myProperty="myValue"] { background-color: red; } ``` 将以上样式表应用到控件上,即可使设置了自定义属性的控件显示红色背景。 需要注意的是,自定义属性的类型只能是字符串。如果要设置其他类型的属性,可以使用 QVariant 类型进行转换。 总结来说,通过在槽函数内使用 setProperty() 方法给控件设置自定义属性,然后在样式表中使用设置的属性值来定义样式,就可以实现在 QSS 内给控件设置自定义属性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mahuifa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值