QT控件自定义属性并支持QSS样式表+读取样式表的属性值

news/2024/7/2 9:01:02

样式表里有很多属性,例如

边框颜色 border-color、边框半径 border-radius、背景颜色 background-color、字体大小font-size: 等等

实际上,对于我们自定义的控件类,新增的属性值,也可以支持样式表:

直接上例子:

#include <QPushButton>

class CustomButton
    : public QPushButton
{
    Q_OBJECT
//添加一个自定义属性,名字为borderColor
    Q_PROPERTY(QColor borderColor READ GetBorderColor WRITE SetBorderColor)
public:
    CustomButton(QWidget *parent = nullptr);
    virtual ~CustomButton();

    QColor GetBorderColor() const;
    void SetBorderColor(const QColor& color);

protected:
    virtual void paintEvent(QPaintEvent* event) override;

private:
    QColor m_borderColor;
};

#include "CustomButton.h"

#include <QDebug>

CustomButton::CustomButton(QWidget *parent)
    : QPushButton(parent)
{
}

CustomButton::~CustomButton()
{
}

QColor CustomButton::GetBorderColor() const
{
    return m_borderColor;
}

void CustomButton::SetBorderColor(const QColor& color)
{
    //样式表中设置的属性值,会在这里被加载,其他成员函数读取m_borderColor就可以获得样式表中设置的值
    m_borderColor = color;
}

void CustomButton::paintEvent(QPaintEvent* event)
{
    QPushButton::paintEvent(event);
    //接下来就可以读取m_borderColor的值,来绘制一些你想要绘制的图形了
    
}

 对应的样式表内容为:

CustomButton {
    qproperty-borderColor: red;
/*qproperty-borderColor: #FF0000;*/
}

C++中自定义的属性borderColor,在qss中对应的名字为:qproperty-borderColor。冒号后面的值对应为该属性的值,他会被传递进C++代码中。

--------分割线-------------------------------------------------------------------------------------------------------

以上代码演示了C++如何获取样式表中自定义的属性值,那么对于QT内置的一些属性,C++如何获取QSS中定义的值呢?

先上答案:有些属性值可以读到,有些被QT给private了,读不到。

对于被private的属性值,可以通过QMetaObject::invokeMethod来强行读出来,但是这违背了QT/C++的设计理念。不推荐。

下面演示C++如何读取QT公开的qss属性值。

首先是QSS示例文件:

MyWidget
{
    background-color: red;/*背景色*/
    color: white;    /*文字色*/
}

MyWidget:hover
{
    background-color: green;  /*鼠标悬停色*/  
}
void MyWidget::paintEvent(QPaintEvent *event)
{
    QStyleOption opt;
    opt.initFrom(this);//读取qss设置的样式
    QPainter p(this);
    //按照qss的设置来绘制widget
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);    
        
    
    
    QPalette pal = opt.palette;
    //读背景色,会读到red
    QBrush backgroundBrush = pal.brush(QPalette::Background);
    //读文字颜色,会读到white
    QColor textColor = pal.color(QPalette::Text);
    //读鼠标悬停时的背景色,会读到green
    QBrush hoverBrush = pal.brush(QPalette::Highlight);

    // 判断该控件上是否被鼠标悬停
    if (opt.state & QStyle::State_MouseOver) {
        backgroundBrush = hoverBrush;
        textColor = hoverBrush.color();
    }

    //下面根据读到的qss值,随意绘制你想要的图形
    painter.fillRect(rect(), backgroundBrush);
    painter.setPen(textColor);
    painter.drawText(rect(), Qt::AlignCenter, tr("Hello, World!"));

}


http://lihuaxi.xjx100.cn/news/1237402.html

相关文章

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布

2023年6月12日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中&#xff0c;1Panel进一步增强了安全方面的能力&#xff0c;包括新增SSH配置管理、域名绑定和IP授权支持&#xff0c;以及启用网站防盗链功能。此外&#xff0c;该版本…

OpenMMLab-AI实战营第二期-课程笔记-Class 3:RTMPose关键点检测

Class 3&#xff1a;RTMPose关键点检测 文章目录 Class 3&#xff1a;RTMPose关键点检测概述安装相关库为了方便使用者快速上手 MMPose&#xff0c;这次课程有着丰富的示例代码脚本&#xff0c;以及详细的技术文档&#xff0c;包括安装、数据集准备、使用教程、常见问题解答等。…

VirusTotal——您身边的企业安全专家

【本文由 Cloud Ace 整理发布。Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证…

声发射监测方法

声发射监测方法 1. 声发射的基本原理2. 交替循环载荷下的金属件累积损伤3. 声发射检测疲劳裂纹的原理4. 声发射信号的特征提取与去噪4.1 声发射信号的主要噪声来源4.2 去噪措施5. 一些商用品牌AE传感器及基础型号6 应用场景参考文献1. 声发射的基本原理 检测原理: 通过声发射…

AntDB 存储技术——Hash分片技术

单台机器很难处理海量的数据或者很高的并发查询&#xff0c;需要把数据拆分到多个节点上&#xff0c;在多个节点上进行存储和处理&#xff0c;这种技术叫作数据分区&#xff0c;也称为数据分片。数据分片的主要目的是提高可扩展性&#xff0c;使数据分散到多个节点上&#xff0…

【Spring学习之更简单的读取和存储Bean对象】教会你使用五大类注解和方法注解去存储 Bean 对象

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们依然是学习Spring&#xff0c;这里我们会更加了解Spring的知识&#xff0c;知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。 &#x1f49f;&#x1f49f;前路漫漫&#xff0c;希望大家坚持…

mybatis-plus入门笔记

快速开始demo 创建数据库 DROP TABLE IF EXISTS user;CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱,PRIMARY K…

原点安全携“金融机构消费者个人信息保护解决方案”亮相 2023 中国金融数字化转型发展大会

6 月 7 日&#xff0c;由中国金融电子化集团有限公司、南京市建邺区人民政府、中国人民银行南京分行主办&#xff0c;主题为“数驱转型 智创未来”的「2023 中国金融数字化转型发展大会暨第十三届中国城市商业银行信息化发展创新座谈会」于南京国际博览中心隆重召开。 本次会议…