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

Qt 实战(11)样式表 | 11.1、样式表简介

文章目录

  • 一、样式表简介
    • 1、简介
    • 2、样式表语法
      • 2.1、样式规则
      • 2.2、选择器类型
      • 2.3、伪状态
      • 2.4、设置子控件状态
    • 3、样式表继承与优先级
      • 3.1、样式表继承
      • 3.2、样式表优先级
      • 3.3、解决冲突
      • 3.4、样式表层叠
    • 4、总结

前言:

在开发图形用户界面(GUI)应用时,美观和一致性是吸引用户的重要因素。Qt,作为一个功能强大的跨平台C++图形用户界面应用程序开发框架,提供了一个强大的工具——Qt样式表(Qt Style Sheets, QSS),来帮助开发者轻松地定制和美化应用程序的界面。

一、样式表简介

1、简介

Qt样式表是一种类似于层叠样式表(Cascading Style Sheets, CSS)的声明性语言,它允许开发者通过简单的规则来定义Qt控件的外观和布局。这些规则可以应用于单个控件,也可以应用于整个应用程序的所有控件,从而实现一致且吸引人的用户界面。

2、样式表语法

2.1、样式规则

样式表包含了一系列的样式规则,每个样式规则由选择器声明组成。选择器指定了受该规则影响的部件,声明指定了这个部件上要设置的属性。例如:

StyleSheetExample::StyleSheetExample(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);ui.m_pOkBtn->setStyleSheet("QPushButton{color:red}");
}

Qt样式表中声明(即:规则中的key与value)一般不区分大小写,例如:QPushButton{Color:Red}QPushButton{color:red}效果是一样的,但是,选择器是区分大小写的。同时多个选择器可以指定相同的规则使用;隔开,例如:

QPushButton, QLineEdit, QComboBox{color:red}

样式规则的声明部分是一些"属性":"值"对组成的列表,它们包含在{}中,使用;隔开,例如:

QPushButton(color:red; background-color:white)

在Qt帮助文档中,使用Qt Style Sheets Reference关键字对应文档中的List of Properties 一项中查看Qt样式表支持的所有属性。

2.2、选择器类型

类型示例功能
通用选择器*匹配所有部件
类型选择器QPushButton匹配所有QPushButton实例和它的所有子类
属性选择器QPushButton[flag=“false”]匹配QPushButton的属性flag为false的实例
类选择器.QPushButton匹配所有QPushButton实例,但不包含它的子类
ID选择器QPushButton#okButton匹配所有QPushButton中以okButton为对象名的实例
后代选择器QDialog QPushButton匹配所有QPushButton实例,它们必须是QDialog的子孙部件
孩子选择器QDialog>QPushButton匹配所有的QPushButton实例,它们必须是QDialog的直接子部件

2.3、伪状态

样式表中的伪状态(pseudo-states)是一种强大的功能,它允许开发者根据小部件(widget)的特定状态来应用不同的样式规则。这些状态描述了小部件在特定情况下的外观,比如鼠标悬停、选中、禁用等。伪状态出现在选择器的末尾,通过冒号:进行标记。例如:

/* 定义 QPushButton 的 :hover 伪状态样式 */
ui.m_pOkBtn->setStyleSheet("QPushButton:hover{background-color:darkblue;}");

伪状态与普通样式混合使用,如下:

/* 定义 QPushButton 的样式 */
ui.m_pOkBtn->setStyleSheet("QPushButton{background-color:red;} \QPushButton:hover{background-color:darkblue;} \QPushButton:pressed{background-color:yellow;}");

Qt Style Sheets Reference关键字对应帮助文档的List of Pseudo-States一项中列出了Qt支持的所有伪状态。

2.4、设置子控件状态

对于一些复杂的部件修改样式,可能需要访问它们的子控件,例如:QComboBox的下拉按钮、还有QSpinBox的向上和向下箭头等。选择器可以包含子控件来对部件的特定子控件应用规则,例如:

QComboxBox::drop-down{image:url(dropdown.png)}

这样的规则可以改变所有QComboBox部件的下拉按钮的样式。Qt Style Sheets Reference关键字对应帮助文档的List of Stylable Widgets一项中列出了所有可以使用的样式表来自定义样式的Qt部件,List of SubControls一项中列出了所有可用的子控件。

3、样式表继承与优先级

Qt样式表的继承与优先级是确保界面元素正确显示的关键机制,通过理解选择器的权重和层叠性,可以有效控制样式的应用。以下是对其具体介绍:

3.1、样式表继承

  • 基本概念: 在Qt中,样式表的继承指的是子控件自动获取父控件的某些样式属性。例如,如果一个QWidget设置了背景颜色,那么它的所有子控件也会默认继承这个背景颜色,除非子控件显式地覆盖了这一属性。
  • 实现方式: 要实现样式继承,通常不需要额外的操作。只需为父控件设置样式,子控件就会自动继承这些样式。如果需要阻止某些样式属性的继承,可以在子控件中明确设置该属性。

3.2、样式表优先级

Qt样式表的优先级规则是由选择器的具体性、样式表加载的顺序以及内联样式等因素共同决定的。以下是对Qt样式表优先级规则的具体介绍:

  • 选择器具体性:

    • 更具体的元素选择器: 在QSS中,更具体的元素选择器(如#id, .class)比通用选择器(如或E>)具有更高的优先级。例如,QPushButton { color: red; }中的QPushButton是一个类型选择器,而.QPushButton则是一个类选择器,它们的优先级高于通用选择器如* { color: green; }
    • 伪状态选择器: 带有伪状态的选择器(如:hover)比不带伪状态的选择器具有更高的优先级。例如,QPushButton:hover { background-color: yellow; }中的:hover伪状态选择器会在鼠标悬停时覆盖普通状态下的样式设置。
  • 样式表加载顺序:

    • 内联样式: 直接在控件的setStyleSheet()方法中设置的样式表具有最高的优先级,因为它们是在运行时立即生效的。例如,button->setStyleSheet("QPushButton { background-color: yellow; }");中的样式设置会覆盖其他所有样式表中的相同设置。
    • 外部文件加载: 在resources目录下的*.qss文件中定义的样式,其优先级高于其他外部样式表。例如,如果应用程序启动时应用了styles.qss文件中的样式,这些样式将优先于HTML或XML文档中的样式。
  • 默认主题中的样式:

    • 如果应用使用了Qt的主题(如FusionCupertino等),默认主题中的样式具有较高的优先级,可以在主题文件中覆盖。例如,Fusion主题中的样式设置会优先于应用程序中自定义的样式表,除非在主题文件中进行了覆盖。
  • 选择器的权重:

    • ID选择器: ID选择器(如#objectName)具有最高的优先级,因为它是唯一匹配特定对象的选择器。例如,#myButton { font-size: 18pt; }中的#myButton会选择objectNamemyButton的对象并应用样式。
    • 类选择器: 类选择器(如.className)的优先级次于ID选择器,但高于元素选择器。例如,.redButton { color: red; }中的.redButton会选择所有class属性为redButton的对象并应用样式。
    • 元素选择器: 元素选择器(如E*>)的优先级最低,因为它是最不具体的选择器。例如,QWidget > QPushButton { border: 2px solid black; }中的QWidget > QPushButton会选择所有QWidget的直接子控件QPushButton并应用样式。

3.3、解决冲突

在Qt样式表中,当多个选择器对同一个控件的相同属性设置了不同的值时,就会产生冲突。为了解决这些冲突,Qt样式表遵循以下原则:

  • 更具体的选择器优先

    • 如果一个选择器比另一个选择器更具体(例如,一个选择器指定了ID,而另一个选择器只指定了类型),则更具体的选择器设置的样式将优先生效。
    • 例如,对于QPushButton,明确指定了ID的QPushButton#okButton将覆盖普通QPushButton的颜色设定。
  • 附加状态的选择器优先

    • 带有伪状态(如:hover:checked等)的选择器比没有伪状态的选择器更特殊。
    • 例如,QPushButton:hover{color:white}会比QPushButton{color:red}更优先,当鼠标悬浮在按钮上时,字体颜色会显示为白色。
  • 相同特殊性下的后设置原则

    • 如果两个选择器的特殊性一致,则后设置的样式将覆盖先设置的样式。
    • 例如,QPushButton:enabled{color:red}QPushButton:hover{color:white}具有相同的特殊性,但当鼠标悬浮在一个可用的按钮上时,按钮文字的颜色为红色,因为QPushButton:enabled是后设置的。然而,如果调整顺序或增加选择器的特殊性(如QPushButton:hover:enabled{color:white}),则可以改变这一结果。

3.4、样式表层叠

样式表层叠指的是可以在多个层级上设置部件的样式,并根据优先级和特异性来决定最终应用的样式。

  • 样式表的来源:
    • 应用程序级别: 通过 QApplication::setStyleSheet() 设置的样式表。
    • 窗口级别:通过 QWidget::setStyleSheet() 设置的样式表。
    • 控件级别:通过特定控件的 setStyleSheet() 方法设置的样式表。
  • 优先级:
    • 控件级别:特定控件上的样式表优先级最高。
    • 窗口级别:在窗口或对话框上设置的样式表。
    • 应用程序级别:在 QApplication 上设置的样式表优先级最低。
  • 特异性:
    • ID 选择器(例如 #myWidget):特异性最高。
    • 类选择器(例如 .myClass)和伪类选择器(例如 :hover)。
    • 元素选择器(例如 QPushButton)和伪元素选择器(例如 ::before)。
  • 重要性:
    • 使用!important标记可以强制某个属性覆盖其他规则。然而,在Qt样式表中过度使用!important可能会导致样式表难以维护和管理。

4、总结

Qt 样式表是一个功能强大且易于使用的工具,它允许开发者以类似CSS的方式自定义Qt控件的外观。通过理解Qt 样式表的基本概念、优势、基本用法和层叠规则,开发者可以创建出美观、易用且跨平台的Qt应用程序。

相关文章:

Qt 实战(11)样式表 | 11.1、样式表简介

文章目录 一、样式表简介1、简介2、样式表语法2.1、样式规则2.2、选择器类型2.3、伪状态2.4、设置子控件状态 3、样式表继承与优先级3.1、样式表继承3.2、样式表优先级3.3、解决冲突3.4、样式表层叠 4、总结 前言: 在开发图形用户界面(GUI)应…...

WebGl 多缓冲区和数据偏移

1.多缓冲区 多缓冲区技术通常涉及到创建多个缓冲区对象,并将它们用于不同的数据集。这种做法可以提高数据处理效率,尤其是在处理大量数据或需要频繁更新数据时。通过预先分配和配置多个缓冲区,可以在不影响渲染性能的情况下,快速…...

基于SSM的甜品店销售管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

Spacetime Gaussian Feature Splatting for Real-Time Dynamic View Synthesis

Spacetime Gaussian Feature Splatting for Real-Time Dynamic View Synthesis 摘要 动态场景的新视角合成一直是一个引人入胜但充满挑战的问题。尽管最近取得了很多进展,但如何同时实现高分辨率的真实感渲染、实时渲染和紧凑的存储,依然是一个巨大的…...

PCL 基于FPFH特征描述子获取点云对应关系

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 FPFH特征计算函数 2.1.2 获取点云之间的对应点对函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总…...

项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143105881 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…...

OpenCV坐标系统与图像处理案例

在图像处理中,理解图像的坐标系统是至关重要的。OpenCV,作为一个强大的计算机视觉库,提供了丰富的功能来操作图像。本文将介绍OpenCV中的坐标系统,并提供一个简单的案例来展示如何使用这些坐标来修改图像的特定区域。 OpenCV坐标…...

Unity之如何使用Unity Cloud Build云构建

文章目录 前言什么是 UnityCloudBuild?如何使用Unity云构建Unity 团队中的人员不属于 Unity Team 的人员UnityCloudBuild2.0价格表如何使用Unity云构建配置CloudBuild前言 Unity Cloud Build作为Unity平台的一项强大工具,它允许开发团队通过云端自动构建项目,节省了繁琐的手…...

Halcon开启多线程

并行运算(提升检测时间) 支持主线程中的子线程并行执行程序和调用算子。 一旦启动,子线程由线程 ID 标识,该线程 ID 是一个取决于操作系统的整数进程号。 子线程的执行独立于它们启动的线程。 因此,无法预测子线程执行…...

Echarts 点击事件无法使用 this 或者 this绑定的数据无法获取

这里写自定义目录标题 现象解决方案 现象 给echarts绑定自定义点击事件时,无法使用this,并且无法获取到this绑定的数据。 解决方案 增加:const _this this; 代码块如下: const _this this; let myChart echarts.init(docum…...

PCL 基于距离阈值去除错误对应关系(永久免费版)

目录 一、概述1.1 原理1.2 实现步骤1.3应用场景 二、关键函数2.1 获取初始点对2.2 基于距离的对应关系筛选函数2.3 可视化 三、完整代码四、结果展示 即日起,付费专栏所有内容将以永久免费形式陆续进行发表!!! 一、概述 在3D点云的…...

DirectX 11 和 Direct3D 11 的关系

以下是对两者的详细比较: DirectX 11 DirectX 11是微软的一项技术,为高性能游戏和复杂图形程序制定了标准。它是DirectX系列的一个版本,引入了多项创新功能,如硬件加速的Tessellation(细分曲面技术)、多线…...

什么是SCRM?为什么企业要做SCRM?

很多人都知道CRM是客户关系管理系统,而SCRM又是什么呢? 今天我就给大家用一文讲清SCRM的那些事,本文包括:SCRM 的定义与内涵,与传统 CRM 的区别;通过案例阐述其重要性及作用,如适应消费模式转变…...

类间方差,分割地物

类间方差(Inter-class Variance)是用于图像分割中的一种统计量,特别是在使用Otsu方法进行阈值选择时。它衡量的是分割后两个类别(通常是前景和背景)之间的分离程度。类间方差越大,说明两个类别之间的差异越…...

基于微博评论的自然语言处理情感分析

目录 一、项目概述 二、需要解决的问题 三、数据预处理 1、词汇表构建(vocab_creat.py) 2、数据集加载(load_dataset.py) 四、模型构建(TextRNN.py) 1、嵌入层(Embedding Layer&#xff…...

MFEM( Modular Finite Element Methods)是一个灵活的、可扩展的、开源的有限元库

MFEM( Modular Finite Element Methods )是一个灵活的、可扩展的、开源的有限元库,主要用于求解偏微分方程(PDE)问题。MFEM的目标是通过模块化设计和强大的抽象能力,简化有限元方法的使用,并支持高效的并行计算,尤其是在复杂的几何形状和自适应网格细化的情况下。 核…...

在VMware上创建虚拟机以及安装Linux操作系统,使用ssh进行远程连接VMware安装注意点 (包含 v1,v8两张网卡如果没有的解决办法)

一,VMware上创建虚拟机 1.VMware下载 1)点击VMware官网进入官网 网址:VMware by Broadcom - Cloud Computing for the EnterpriseOptimize cloud infrastructure with VMware for app platforms, private cloud, edge, networking, and security.https…...

关于vue3中如何实现多个v-model的自定义组件

实现自定义组件<User v-model"userInfo" v-model:gender"gender"></User> User组件中更改数据可以同步更改父组件中的数据&#xff1a; 1 父组件&#xff1a; <User v-model"userInfo" v-model:gender"gender">&…...

【STM32项目_2_基于STM32的宠物喂食系统】

摘要&#xff1a;本文介绍一款基于 STM32 的宠物喂食系统资源。该系统以 STM32 为核心&#xff0c;集成多种传感器与设备&#xff0c;涵盖 DHT11、HX711、减速马达及 ESP8266 模块&#xff0c;具备环境监测、精准喂食、网络连接及数据存储功能。 &#x1f51c;&#x1f51c;&am…...

商场楼宇室内导航系统

商场楼宇室内导航系统 本文所涉及所有资源均在传知代码平台可获取 文章目录 商场楼宇室内导航系统效果图导航效果图查看信息数据加载加载模型模型选型处理楼层模型绑定店铺创建店铺名称动态显示隐藏2d元素空气墙查看信息楼梯导航效果图 导航效果图 查看信息 数据加载 因为是一…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...