当前位置: 首页 > news >正文

Qss自定义属性

QSS自定义属性

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

文章目录

  • QSS自定义属性
    • @[toc]
  • 前言
  • 一、实现效果
  • 二、使用方式
    • 1.QSS设置Q_PROPERTY属性样式
    • 2.QSS设置动态属性样式
    • 3.qproperty-<属性名称>语法1
    • 4.qproperty-<属性名称>语法2
  • 四、主要代码
  • 五、源代码

前言

  • 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_NAMESPACEclass Widget : public QWidget
    {Q_OBJECTQ_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注册的枚举修改属性值,属性的类型就需要时【枚举的类型】,而不能是其它类型,例如intpublic: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注册的枚举修改自定义属性值*/
    }

五、源代码

  • github
  • gitee

相关文章:

Qss自定义属性

QSS自定义属性 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;QSS样式学习 &#x1f448;文章目录QSS自定义属性[toc]前言一、实现效果二、使用方式1.QSS设置Q_PROPERTY属性样式2.QSS设置动态属性样式3.qproperty-<属性名称>语法14.qproperty-&…...

连接金蝶云星空,数据交互轻松搞定!丨三叠云

金蝶云星空 路径 拓展 >> 插件 功能简介 新增插件「金蝶云星空」。 用户可通过配置「金蝶云星空」插件&#xff0c;就可以实时获取「金蝶云星空」的数据&#xff0c;同时支持回填数据至金蝶系统内。 地图视图 路径 表单 >> 表单设计 功能简介 新增「地图视…...

JSX是什么,React为什么使用JSX,babel怎么转译JSX的

JSX是什么&#xff0c;React为什么使用JSX&#xff0c;babel怎么转译JSX的 在前端的框架中有两种“描述UI”的方案&#xff0c;一种是JSX语法&#xff0c;一种是模板语言。 其中React就是选择的JSX&#xff0c;Vue就是选择的模板语言。 JSX其实就是一个语法糖&#xff0c;在…...

从工地转行软件测试,拿下13k+年终奖是种什么体验?

最近&#xff0c;一则名为《我&#xff1a;毕业五年&#xff0c;存款5000。她:中传硕士&#xff0c;火锅店保洁》的视频走红网络&#xff0c;两位名校毕业生看似高开低走的就业经历&#xff0c;引起了很多人的共鸣。她们所传达的并不是所谓的躺平、摆烂&#xff0c;而是希望更多…...

前端面试题 —— 计算机网络(二)

目录 一、POST和PUT请求的区别 二、GET方法URL长度限制的原因 三、页面有多张图片&#xff0c;HTTP是怎样的加载表现&#xff1f; 四、HTTP2的头部压缩算法是怎样的&#xff1f; 五、说一下HTTP 3.0 六、HTTP协议的性能怎么样&#xff1f; 七、数字证书是什么&#xff1f…...

山东大学机器学习期末2022

接力&#xff1a;山东大学机器学习期末2021 本来是不想写的&#xff0c;因为不想回忆起考试时啥也不会的伤痛&#xff0c;没想到最后给分老师海底捞&#xff0c;心情好了一些&#xff0c;还是一块写完 备考建议&#xff1a;多看ppt&#xff0c;多看ppt&#xff0c;多看ppt 山东…...

FEBC2022|打造VR内容生态闭环 佳创视讯持续加码轻量化内容建设

2月24日&#xff0c;由陀螺科技主办的未来商业生态链接大会作为 2023 癸卯兔年开年率先召开的行业重要影响力盛会在深圳成功召开。今年大会云集了科技、软件、游戏、XR等元宇宙领域的世界500强、上市公司及行业独角兽企业&#xff0c;围绕游戏、元宇宙、XR、数字营销等多项热门…...

Redis常见的数据类型命令

文章目录Redis 常见的数据类型及命令一、常见的NoSQL二、Redis 简介三、key 键的一些操作命令四、Redis的五种基本数据结构1、String&#xff08;字符串&#xff09;介绍常用命令1.1 set/get1.2 append1.3 strlen1.4 setex1.5 mset/mget1.6 setrange/getrange1.7 setnx1.8 incr…...

Python3+Selenium3自动化测试-(准备)

最近在学习selenium自动化测试相关的内容&#xff0c;所以将实际准备情况做一记录&#xff0c; # 系统&#xff1a;win10(64位) # 浏览器&#xff1a;Chrome(67.0)、Firefox(61.0)、IE # python版本&#xff1a;3.6.5 # Selenium&#xff1a;3.13.0Selenium简介 Selenium是一…...

VUE的安装和创建

安装node.js 进入node官网进行下载&#xff0c;然后一直下一步。 测试是否安装成功&#xff1a; 命令提示窗下执行&#xff1a;npm -v 若出现版本号&#xff0c;则安装成功。 安装npm源&#xff1a; npm config set registry http://registry.npm.taobao.org 查看&#xff1a;…...

ETL工具(kettle) 与 ETL产品(BeeloadBeeDI) 差之毫厘,谬以千里

E T L——是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。工具——原指工作时所需用的器具&#xff0c;后引申为达…...

轻松入门H3C无线AC上线AP【入门篇】

我们知道华三的最新模拟器支持了无线AC的配置&#xff0c;今天就浅浅的出个无线AC的教程&#xff0c;你上也会的那种。今天我们模拟的是二层环境下&#xff0c;笔者准备了2个AP&#xff0c;以此展示AP上线到AC的教程&#xff0c;并且用手机测试WiFi连接正常&#xff0c;且客户端…...

尚医通(二十五)就医提醒和预约统计

目录一、就医提醒1、搭建定时任务模块二、后台管理系统-预约统计功能1、开发每天预约数据接口2、封装远程调用接口3、搭建统计分析模块4、整合统计功能前端一、就医提醒 我们通过定时任务&#xff0c;每天8点执行&#xff0c;提醒就诊 1、搭建定时任务模块 &#xff08;1&…...

网页js版音频数字信号处理:H5录音+特定频率信号的特征分析和识别提取

文章目录一、网页中的音频数据源二、FFT&#xff1a;时域转频域三、信号的特征分析四、信号的识别提取附录音频数字信号处理 Audio DSP (Digital Signal Processing) 是一个复杂又专业的话题&#xff0c;本文介绍的是如何从音频中实时分析和识别出特定频率信号的一种方法&#…...

uniapp结合腾讯云及时通信IM的聊天记录本地存储方案

uniapp结合腾讯云及时通信IM的聊天记录本地存储方案 UniApp 是一个跨平台的应用开发框架&#xff0c;可以使用 Vue.js 开发多端应用&#xff08;如H5、小程序、App等&#xff09;。在 UniApp 中&#xff0c;可以使用 uni-app 提供的文件系统 API 完成本地文件存储的操作。 1.…...

PyQGIS开发 -- 基础学习笔记

1、自主学习QGIS开发虽然QGIS本身功能强大&#xff0c;但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到&#xff0c;扩展QGIS有2种方法&#xff0c;一是用Python、C来写QGIS的插件&#xff1b;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…...

一篇了解模块打包工具之 ——webpack(1)

本篇采用问题引导的方式来学习webpack&#xff0c;借此梳理一下自己对webpack的理解&#xff0c;将所有的知识点连成一条线&#xff0c;形成对webpack的记忆导图。 最终目标&#xff0c;手动构建一个vue项目&#xff0c;目录结构参考vue-cli创建出来的项目 一、问问题 1. 第…...

k8s学习之路 | Day16 k8s 中的容器初探

文章目录容器镜像镜像名称镜像拉取策略私有仓库的拉取策略容器的环境变量和启动命令容器的环境变量容器的启动命令容器的生命周期钩子postStartpreStop容器的探针startupProbelivenessProbereadinessProbek8s 集群中最小的管理单元就是一个Pod&#xff0c;而Pod里面才是容器&am…...

export、import、commit、save、load的区别

目录1. docker export 和 docker import2. docker commit3.docker save 和 docker load1. docker export 和 docker import docker export 容器ID/容器Name > xxx.tar 导出一个容器快照 docker import xxx.tar NewImageName:tag 导入一个容器快照到本地镜像库 适用场景&a…...

多部委联合举办中国人工智能大赛启动会在厦召开,快商通亮相发言

站在“第二个百年奋斗目标”的新起点上&#xff0c;为深入推动我国人工智能产业创新发展&#xff0c;发掘一批人工智能优秀团队&#xff0c; 国家互联网信息办公室、工业和信息化部、公安部、国家广播电视总局、厦门市人民政府将联合主办第四届中国人工智能大赛 。快商通联合创…...

js红宝书学习笔记(1-6章)

就按照原书中写的章节顺序记笔记了&#xff0c; 还有可能我学过js一段时间了&#xff0c;可能有些对于新手的细节会忽略&#xff0c;但是会尽量写全的~ 1.第一章 什么是JavaScript 1.1讲了一些历史&#xff0c;所以我们从1.2开始看 1.2 JavaScript的实现 完整的JaveScript包…...

第十四届蓝桥杯第三期官方模拟赛C\C++题解

文章目录A-填空题题意算法参考代码&#xff08;C&#xff09;B-填空题题意算法参考代码&#xff08;C&#xff09;C-填空题题意算法参考代码&#xff08;C&#xff09;D-填空题题意算法参考代码&#xff08;C&#xff09;E-填空题题意算法参考代码&#xff08;C&#xff09;F题…...

API接口安全

目前项目都是前后端分离或者有对外提供接口的需求&#xff0c;在这些情况下&#xff0c;就要考虑接口安全。 如果不重视接口安全&#xff0c;可能导致严重的危害&#xff0c;例如数据盗取&#xff0c;服务宕机等。 可能的安全问题: 1.明文密码被攻击者抓包看到 前端可对密码或…...

2023前端一面vue面试题合集

函数式组件优势和原理 函数组件的特点 函数式组件需要在声明组件是指定 functional:true不需要实例化&#xff0c;所以没有this,this通过render函数的第二个参数context来代替没有生命周期钩子函数&#xff0c;不能使用计算属性&#xff0c;watch不能通过$emit 对外暴露事件&…...

【Leetcode 剑指Offer】第 5 天 查找算法(中等)

查找算法剑指 Offer 04. 二维数组中的查找剑指 Offer 11. 旋转数组的最小数字剑指 Offer 50. 第一个只出现一次的字符Python字典基础哈希表&#xff08;python中是dict()&#xff09;有序哈希表第一个中等&#xff0c;后两个简单题。剑指 Offer 04. 二维数组中的查找 题&#…...

薯条投放适合哪些笔记?小红书薯条投放的3种模式

随着小红书平台的种草推广模式兴盛&#xff0c;薯条投放这个词也渐渐进入大众的视野&#xff0c;今天就来给大家讲讲什么是薯条投放&#xff0c;以及薯条投放适合哪些笔记。一、什么是薯条投放?薯条是一款为小红书用户打造的笔记推广工具&#xff0c;用户可选择推广目标&#…...

记录第一个Python练习的过程

题目如下 编写一个名为collatz()的函数&#xff0c;它有一个名为number的参数。如果参数是偶数&#xff0c;那么collatz()就打印出number // 2&#xff0c;并返回该值。如果number是奇数&#xff0c;collatz()就打印并返回3 * number 1。 然后编写一个程序&#xff0c;让用户…...

【Python】3.3实现多线程

程序Program进程Process线程Thread为完成特定任务而用计算机语言编写的一组计算机能识别和执行的指令的集合。程序是指令、数据及其组织形式的描述&#xff0c;一段静态代码&#xff0c;静态对象。计算机中的程序关于某数据集合上的一次执行过程。进程是程序的实体&#xff0c;…...

在linux中使用lftp和sftp下载文件(夹)

一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中&#xff0c;一般RedHat系统默认已经安装了openssh-client和openssh-server&#xff0c;即默认已经集成了sftp服务&#xff0c;不需要重…...

Docker简介与用法

文章目录1、Docker简介1.1、Docker能解决什么问题1.2、什么是虚拟机技术1.2.1、虚拟机的缺点1.3、什么是容器1.3.1、容器与虚拟机比较1.4、分析 Docker 容器架构1.4.1、Docker客户端和服务器1.4.2、Docker 镜像(Image)1.4.3、Docker 容器(Container)1.4.4、Docker 仓库(reposit…...

电子商务网站建设基础项目实训报告/吉林百度seo公司

0x00 概述 最近在看关于嵌入式Linux关于Boot的一些资料&#xff0c;准备了一些资料。现在在这里将最近学习到的一些知识做个总结。 这次的总结主要关于Boot的一些参数解析与相应的启动流程总结。 使用了飞凌科技的IMXQ6的开发板2016.06的BOOT适配板搭配的源码进行分析。 因为M…...

网站维护服务内容/汽油价格最新调整最新消息

如何构造预制体&#xff08;Prefab&#xff09;&#xff1f; 选择你需要作为预制体的物体 拖到Assets里面 如何去除物体挂载的脚本文件&#xff1f; 在组件栏操作 Alt鼠标左键、鼠标右键可以实现视角的转变 Box using System.Collections; using System.Collections.Generic…...

网站建设属于什么支出/杭州seo排名优化外包

为什么80%的码农都做不了架构师&#xff1f;>>> 常见的数据库优化方法&#xff1a;索引&#xff08;数据库&#xff09;&#xff0c;缓存&#xff0c;分表&#xff0c;分库&#xff0c;sql优化。 索引&#xff1a;创建索引一般有以下两个目的&#xff1a;维护被索引…...

wordpress mu安装/站点

以下是Python中通过cx_Oracle操作数据库的过程中我所遇到的问题总结&#xff0c;感谢我们测试组的前辈朱勃给予的帮助最终解决了下列两个问题&#xff1a;1&#xff09;安装cx_Oracle会遇到的问题&#xff1a;在Windows下安装cx_Oracle不要尝试用pip install的方式了&#xff0…...

成都哪家网站建设做得好/杭州排名推广

第一种&#xff1a;#a{ background:#FFCC33; filter:alpha(opacity50); /*支持 IE 浏览器*/ -moz-opacity:0.50; /*支持 FireFox 浏览器*/ opacity:0.50; /*支持 Chrome, Opera, Safari 等浏览器*/ width: 300px; height:300px; } 还有一种仅让背景半透明&#xff0c;里面内…...

cookies因预料之外的输出被阻止 wordpress/推广竞价托管费用

Hadoop分布式的搭建 1. 搭建前提 多台计算机计算机需要安装Java网络防火墙关闭计算机之间可以连通 1.1 多台计算机的准备 如果要准备多台真的虚拟机&#xff0c;成本太高&#xff0c;我们在此使用虚拟机 但是安装多台虚拟机速度太慢&#xff0c;所以我们选择克隆 如何克隆?…...