Qt+qss动态属性改变控件状态切换的样式
先说点基础的吧,qt的样式实现,常见的主要有三种方式,分别为:
1.ui界面中右键样式表直接添加
2.代码中对控件设置样式setStyleSheet
3.外部预设好qss文件,代码中加载后设置样式
实际工作开发中,我推荐使用优先级为3>2>1,理由如下:
在ui界面中直接添加样式,优点是可以实时看到基本的ui效果,但对于某些需要切换状态的ui,会比较麻烦。例如我预设了一个标签“没信号”的效果,当我的设备有信号时,我需要在代码中进行“有信号”效果的设置,这样一来,我们难免会在代码中进行重复的setStyleSheet,1和2搭配起来可以正常使用,只是难以管理我们的样式。
另外插一嘴,如果我们在ui界面中设置好了控件的布局,那后续我们在代码中想要改变布局,是极其麻烦的,比如我有四个按钮,原本是上下左右排列的,结果来了一个甲方需求,需要变成从左到右的排列。这样一来,我只能在ui界面中拖拽按钮进行布局,来满足甲方的需求。要命的来了,甲方突然又说,我需要两个版本,上下左右和从左到右都要。你就很头疼了,每次编译发布的时候都需要去修改ui界面,麻烦至极,你甚至一气之下想要拷贝多份代码……这种思路显然是不对的。遇到这种情况,我们应该通过代码来灵活布局,由代码中创建好四个控件,然后新建布局类进行布局。同样,这里的控件样式也只能由代码来进行设置。
然而,我们一旦在多处代码中使用了setStyleSheet,就会让我们的样式设置变得凌乱,特别对于状态切换,比如一个按钮点击了之后,需要切换成其他状态,这部分样式设置一般放在信号槽当中。针对这种情况,我们期望对所有样式表进行有效的管理,于是qss文件这种方式就应运而生了。
简单来说,就是将所有样式表放进qss文件中,通过文件读取来进行统一设置(具体实现就不赘述了。)
然而到了这里,还没有解释控件状态切换需要怎么做。别急,现在就来。
Qt+qss动态属性改变控件状态切换的样式
一个QPushbutton按钮,一般来说会存在三态(常态、鼠标悬浮、鼠标点击按下),复杂的还会有选中和取消使能的状态。这种情况,我们的样式表会这样写:
QPushButton#btn_xxx{
border-image: url(:/image/xxx.png);
color: #000000;
font-size: 18px;
font-family: 黑体;
min-width:110;
max-width:110px;
min-height:40px;
max-height:40px;
}
QPushButton#btn_xxx:hover{
border-image: url(:/image/xxx_over.png);
}
QPushButton#btn_xxx:pressed{
color: #ffffff;
border-image: url(:/image/xxx_down.png);
}
QPushButton#btn_xxx:checked{
color: #ffffff;
border-image: url(:/image/xxx_checked.png);
}
QPushButton#btn_xxx:disabled{
color: #ffffff;
border-image: url(:/image/xxx_disabled.png);
}
以QPushButton#btn_xxx:pressed为例,分别为类名,对象名和控件状态,btn_xxx是这个按钮(这类按钮)的名称,记得要setObjectName,样式表才会生效哦。而pressed是QPushButton自带的一种控件状态,其他控件可不一定有。
然而,这一套样式表只针对于按钮的一种“状态”,这里的状态指的是不同的样式,比如绿色的按钮和红色的按钮,两种颜色的按钮分别都有以上的五种控件状态。
如何进行不同颜色样式的状态切换呢?我们需要添加控件的属性setProperty
首先,样式表的QPushButton#btn_xxx:pressed要进行改造,变为QPushButton#btn_xxx:pressed[State=‘Green’],这样该条样式就具有了属性,即当该控件的属性State为Green时,才会应用这条样式。
于是我们的样式表可以改成:
//green
QPushButton#btn_xxx[State='Green']{
border-image: url(:/image/xxx.png);
color: #000000;
font-size: 18px;
font-family: 黑体;
min-width:110;
max-width:110px;
min-height:40px;
max-height:40px;
}
QPushButton#btn_xxx:hover[State='Green']{
border-image: url(:/image/xxx_over.png);
}
QPushButton#btn_xxx:pressed[State='Green']{
color: #ffffff;
border-image: url(:/image/xxx_down.png);
}
QPushButton#btn_xxx:checked[State='Green']{
color: #ffffff;
border-image: url(:/image/xxx_checked.png);
}
QPushButton#btn_xxx:disabled[State='Green']{
color: #ffffff;
border-image: url(:/image/xxx_disabled.png);
}//red
QPushButton#btn_xxx[State='Red']{
border-image: url(:/image/xxx.png);
color: #000000;
font-size: 18px;
font-family: 黑体;
min-width:110;
max-width:110px;
min-height:40px;
max-height:40px;
}
QPushButton#btn_xxx:hover[State='Red']{
border-image: url(:/image/xxx_over.png);
}
QPushButton#btn_xxx:pressed[State='Red']{
color: #ffffff;
border-image: url(:/image/xxx_down.png);
}
QPushButton#btn_xxx:checked[State='Red']{
color: #ffffff;
border-image: url(:/image/xxx_checked.png);
}
QPushButton#btn_xxx:disabled[State='Red']{
color: #ffffff;
border-image: url(:/image/xxx_disabled.png);
}
哎,没错,样式表的代码量确实多了一倍,但如此一来,我们就能通过代码来切换状态啦,记得setProperty之后要调用unpolish和polish,不然样式可能无法成功修改
void xxx::slot_xxx(bool b_flag)
{if(b_flag){btn_xxx->setProperty("State","Green");btn_xxx->style()->unpolish(btn_video_lock); //清除旧的样式btn_xxx->style()->polish(btn_video_lock); //更新为新的样式}else{btn_xxx->setProperty("State","Red");btn_xxx->style()->unpolish(btn_video_lock); //清除旧的样式btn_xxx->style()->polish(btn_video_lock); //更新为新的样式}
}
到了这里,我们基本上就可以用qss一种方式,来实现我所需要的全部需求了。
另外,如果甲方需要整体更换ui,类似换肤这种需求的话,我们直接拷贝一份qss进行修改,由代码来加载不同的qss文件即可。
相关文章:
Qt+qss动态属性改变控件状态切换的样式
先说点基础的吧,qt的样式实现,常见的主要有三种方式,分别为: 1.ui界面中右键样式表直接添加 2.代码中对控件设置样式setStyleSheet 3.外部预设好qss文件,代码中加载后设置样式 实际工作开发中,我推荐使用优…...

纷享销客安全体系:安全运维运营
安全运维运营(Security Operations,SecOps)是指在信息安全管理中负责监控、检测、响应和恢复安全事件的一系列运营活动。它旨在保护组织的信息系统和数据免受安全威胁和攻击的损害。 通过有效的安全运维运营,组织可以及时发现和应对安全威胁,减少安全事…...

富瀚微FH8322 ISP图像调试—BLC校正
1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了,一直没有总结,我们调试ISP的时候,首先一步时确定好sensor的黑电平值,黑电平如果不准,则会影响到后面的颜色及对比度相关模块。…...

什么是大型语言模型 ?
引言 在本文[1]中,我们将从高层次概述大型语言模型 (LLM) 的具体含义。 背景 2023年11月,我偶然间听闻了OpenAI的开发者大会,这个大会展示了人工智能领域的革命性进展,让我深深着迷。怀着对这一领域的浓厚兴趣,我加入了…...

RocketMq详解:二、SpringBoot集成RocketMq
在上一章中我们对Rocket的基础知识、特性以及四大核心组件进行了详细的介绍,本章带着大家一起去在项目中具体的进行应用,并设计将其作为一个工具包只提供消息的分发服务和业务模块进行解耦 在进行本章的学习之前,需要确保你的可以正常启动和…...

【源码】二开版微盘交易系统/贵金属交易平台/微交易系统
二开版微盘交易系统/贵金属交易平台/微交易系统 一套二开前端UI得贵金属微交易系统,前端产品后台可任意更换 此系统框架不是以往的至尊的框架,系统完美运行,K线采用nodejs方式运行 K线结算都正常,附带教程 资源来源:https://www.…...
React@16.x(26)useContext
目录 1,上下文的使用2,useContext 1,上下文的使用 之前的文章中介绍过 context上下文。 使用举例: import React, { useState } from "react";const ctx React.createContext();function Child() {return <ctx.C…...

Vue2学习(04)
目录 一、组件的三大组成部分 二、组件的样式冲突scoped 三、scoped原理 编辑 四、data是一个函数 五、组件通信 1.概念:是指组件与组件之间的数据传递,组件的数据是独立的,无法直接访问其他组件的数据,想用其他组件的数…...

Python中columns()函数
1. columns的概念 在数据分析和处理中,columns是指数据表中的列,也称为字段。每一列代表了特定类型的数据,在一个数据表中,每一行代表了一个数据实例,而每一列则代表了一个特定的特征或属性。 可以直接定义和更改列标题,也可以直接读取某列的数据,或者对某列进行运算。…...
Vue3 使用 vue-clipboard3 实现一键复制
安装依赖 npm install --save vue-clipboard3示例 <template><el-input v-model"data"></el-input><button click"touchCopy">复制链接</button> </template><script setup lang"ts"> // 导入插件 …...
人机环境生态系统智能的流动性
一般来说,流动性可以理解为事物在空间或时间上的转移、变化或运动。在人机环境生态系统中,流动性可以涉及以下几个方面: 信息流动:数据、消息、知识等在系统中的传递和交换。这可能包括传感器收集的数据传输到处理中心,…...

实现开源可商用的 ChatPDF RAG:密集向量检索(R)+上下文学习(AG)
实现 ChatPDF & RAG:密集向量检索(R)上下文学习(AG) RAG 是啥?实现 ChatPDF怎么优化 RAG? RAG 是啥? RAG 是检索增强生成的缩写,是一种结合了信息检索技术与语言生成…...

对待谷歌百度等搜索引擎的正确方式
对待百度、谷歌等搜索引擎的方式是,你要站在搜索引擎之上,保持自己的独立思想和意见。 当谷歌宣布他们将会根据一个名为“Alphabet”的新控股公司来进行业务调整时,在科技界引起了一片恐慌之声。 永远不要说这是一个公司一直在做的事情。不…...

pikachu靶场通关全流程
目录 暴力破解: 1.基于表单的暴力破解: 2.验证码绕过(on server): 3.验证码绕过(on client): token防爆破: XSS: 1.反射型xss(get): 2.反射性xss(post): 3.存储型xss&#…...

实现k8s网络互通
前言 不管是docker还是k8s都会在物理机组件虚拟局域网,只不过是它们实现的目标不同。 docker:针对同一个物理机(宿主机) k8s:针对的是多台物理机(宿主机) Docker 虚拟局域网 K8S虚拟局域网 …...
diffusers 使用脚本导入自定义数据集
在训练扩散模型时,如果附加额外的条件图片数据,则需要我们准备相应的数据集。此时我们可以使用官网提供的脚本模板来控制导入我们需要的数据。 您可以参考官方的教程来实现具体的功能需求,为了更加简洁,我将简单描述一下整个流程…...
【Android面试八股文】请讲一讲synchronized和ReentrantLock的区别
文章目录 请讲一讲synchronized和ReentrantLock的区别这道题想考察什么 ?考察的知识点应该如何回答?Synchronized 的原理ReentrantLock 的原理Synchronized 和 ReentrantLock 的区别总结请讲一讲synchronized和ReentrantLock的区别 这道题想考察什么 ? 是否了解并发相关的理…...

springmvc 全局异常处理器配置的三种方式深入底层源码分析原理
文章目录 springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理配置全局异常处理器的三种方式实现接口HandlerExceptionResolver并配置到WebMvcConfigurer注解式配置ExceptionHandlercontroller里方法上定义ExceptionHandler 深入源码分析进入DispatcherServlet执…...

MySQL 8.0 安装、配置、启动、登录、连接、卸载教程
目录 前言1. 安装 MySQL 8.01.1 下载 MySQL 8.01.2 安装 MySQL 8.0 2. 配置 MySQL 8.02.1打开环境变量2.2新建变量 MYSQL_HOME2.3编辑 Path 变量 3. 启动MySQL 8.03.1验证安装与配置是否成功3.2初始化并注册MYSQL3.3 启动MYSQL服务 4.登录MySQL4.1修改账户默认密码4.2登录MYSQL…...

Pythone 程序打包成 exe
1.安装pyinstaller # 安装 pip install pyinstaller # 查看版本 pyinstaller -v2.更新pyinstaller 版本 # 更新 pip install --upgrade pyinstaller # 查看版本 pyinstaller -v3.切换到 py文件所在目录 #切换到.py所在的目录 E: cd cd E:\x-svn_x-local\04PythoneProjects\A…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...