当前位置: 首页 > 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元素空气墙查看信息楼梯导航效果图 导航效果图 查看信息 数据加载 因为是一…...

2025全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南√

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…...

Vision China 2024 | 移远通信以一体化的AI训练及部署能力,引领3C电子制造智能升级

10月14日&#xff0c;由机器视觉产业联盟(CMVU)主办的中国机器视觉展(Vision China)在深圳国际会展中心盛大开幕。作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信应邀参加展会首日举办的“智造引领数质并进”3C电子制造自动化与数字化论坛。 论坛上&#xff0c;移…...

浏览器播放rtsp视频流解决方案

方案一: html5 websocket_rtsp_proxy 实现视频流直播 实现原理 实现步骤 服务器安装streamedian服务器 客户端通过video标签播放 <video id"test_video" controls autoplay></video><script src"free.player.1.8.4.js"></script&g…...

Ubuntu下查看指定文件大小

Ubuntu下查看指定文件大小 方法一&#xff1a;查看指定文件夹的总大小方法二&#xff1a;查看文件夹内各个子文件夹的大小方法三&#xff1a;查看指定深度的子文件夹大小方法四&#xff1a;使用ls命令查看单个文件的大小注意事项 在Ubuntu中查看指定文件夹的大小&#xff0c;你…...

【南开X上海交大】OPUS:效率显著提升的OCC网络

1. 摘要 占据预测任务旨在预测体素化的3D环境中的占据状态&#xff0c;在自动驾驶领域中迅速获得了关注。主流的占据预测方法首先将3D环境离散化为体素网格&#xff0c;然后在这些密集网格上执行分类。然而&#xff0c;样本数据分析显示&#xff0c;大多数体素实际上是未占据的…...

SqlUtils 使用

一、前言 随着 Solon 3.0 版本发布&#xff0c;新添加的 SqlUtils 接口&#xff0c;用于操作数据库&#xff0c;SqlUtils 是对 Jdbc 原始接口的封装。适合 SQL 极少或较复杂&#xff0c;或者 ORM 不适合的场景使用。 二、SqlUtils 使用 1、引入依赖 <dependency><…...

平面声波——一维Helmhotz波动方程

平面声波的一维Helmholtz波动方程是一种简化的声波传播模型&#xff0c;适用于在一维空间中传播的声波。 声波的基本物理过程---傅里叶变换---Helmholtz方程 一、声波的基本波动方程 在无源、无耗散、均匀介质中的一维声波的波动方程为&#xff1a; 其中&#xff1a; 表示位…...

深度学习 简易环境安装(不含Anaconda)

在Windows上安装深度学习环境而不使用Anaconda&#xff0c;下面是一个基于pip的安装指南&#xff1a; 1. 安装Python 确保你已经安装了Python。可以从Python官网下载Python&#xff0c;并在安装时勾选“Add Python to PATH”选项。 注意&#xff0c;Python 不要安装最新版的…...

Java缓存技术(java内置缓存,redis,Ehcache,Caffeine的基本使用方法及其介绍)

目录 摘要 1. Java缓存技术概述 1.1定义 1.2 优势 1.3 应用场景 2. Java中的内置缓存实现 2.1 通过通过HashMap和ConcurrentHashMap实现缓存 3. Java缓存框架 3.1 Redis 3.1.1 redis的简介 3.1.4 Redis的工作原理 3.1.5 总结 3.2 Ehcache 3.2.1 Eh…...

YoloV9改进策略:主干网络改进|DeBiFormer,可变形双级路由注意力|全网首发

摘要 在目标检测领域,YoloV9以其高效和准确的性能而闻名。然而,为了进一步提升其检测能力,我们引入了DeBiFormer作为YoloV9的主干网络。这个主干网络的计算量比较大,不过,上篇双级路由注意力的论文受到很大的关注,所以我也将这篇论文中的主干网络用来改进YoloV9,卡多的…...