Qt 之 QSS(样式表语法)

2023-10-29

简述

Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同。如果你熟悉CSS,可以快速浏览以下内容。

样式规则

QSS包含了一个样式规则序列,一个样式规则由一个选择器和声明组成,选择器指定哪些部件由规则影响,声明指定哪些属性应该在部件上进行设置。例如:

QPushButton { color: red }

上面的例子中QPushButton是选择器,{ color: red }是声明,该规则指定QPushButton及其子类(例如:MyPushButton)应使用红色作为前景色。

QSS通常不区分大小写(即:color、Color、COLOR、cOloR指同一属性),唯一例外就是类名(class names)、对象名(object names)、属性名(property names)区分大小写。

几个选择器可以指定相同的声明,使用逗号(,)来分隔选择器。例如:

QPushButton, QLineEdit, QComboBox { color: red }

相当于三个规则序列:

QPushButton { color: red }
QLineEdit { color: red }
QComboBox { color: red }

声明部分的规则是一个属性值对(property: value)列表,包含在花括号中,以分号分隔。例如:

QPushButton { color: red; background-color: white }

参考助手:Qt Style Sheets Reference中List of Properties部分。

选择器类型

目前为止,所有的示例使用选择器中最简单的类型,类型选择器。QSS支持所有的selectors defined in CSS2。下表总结了最有用的类型选择器。

选择器

示例

说明

通用选择器

*

匹配所有部件

类型选择器

QPushButton

匹配QPushButton及其子类的实例

属性选择器

QPushButton[flat=”false”]

匹配QPushButton中flat属性为false的实例。可以用此选择器来测试任何支持QVariant::toString()的属性,此外,支持特殊的类属性、类名称。此选择器也可以用来测试动态属性(参考助手:Qt Style Sheets Examples中Customizing Using Dynamic Properties部分)。还可以使用~=替换=,测试QStringList类型的属性是否包含给定的QString。 警告:如果Qt属性值在设置样式之后更改,那么可能需要强制重新计算样式。实现的一个方法是取消样式,然后重新设置一遍。

类选择器

.QPushButton

匹配QPushButton的实例,但不包含子类。相当于*[class~=”QPushButton”]。

ID选择器

QPushButton#okButton

匹配所有objectName为okButton的QPushButton实例。

后代选择器

QDialog QPushButton

匹配属于QDialog后代(孩子,孙子等)的QPushButton所有实例。

子选择器

QDialog > QPushButton

匹配属于QDialog直接子类的QPushButton所有实例。

子控件

对于样式复杂的部件,需要访问子控件,例如:QComboBox的下拉按钮或QSpinBox的上下箭头。选择器可能包含子控件,使得可以限制特有部件子控件的应用规则。例如:

QComboBox::drop-down { image: url(dropdown.png) }
  • 1

上述规则指定了QComboBoxe下拉按钮样式,虽然双冒号(::)语法让人想起CSS3伪元素,但Qt子控件从概念上讲有不同的级联语义。

子控件定位总是相对于另一个参考元素。这个参考元素可能是小部件或其它子控件。例如:QComboBox的::drop-down放置,默认的放置在QComboBox区域的右上角,::drop-down放置,默认的在::drop-down子控件的中央,参考助手:Qt Style Sheets Reference中List of Stylable Widgets部分。

可以使用subcontrol-origin改变子控件原始的默认位置,

QComboBox {
    margin-right: 20px;
}
QComboBox::drop-down {
    subcontrol-origin: margin;
}

下拉的对齐方式可以通过subcontrol-position属性改变。

width和height属性可用于控制子控件的大小,注意:设置一个图片会隐式地设置子控件的大小。

相对定位(position : relative):可以改变子控件相对初始位置的偏移量。例如:按下QComboBox下拉按钮时,我们可能更喜欢用内部箭头偏移量来产生一个被按下的效果。要做到这一点,我们可以指定:

QComboBox::down-arrow {
    image: url(down_arrow.png);
}
QComboBox::down-arrow:pressed {
    position: relative;
    top: 1px; left: 1px;
}

绝对定位(position : absolute):允许子控件改变位置和的大小而不受参考元素限制。一旦位置被设定,这些子控件将被和普通部件(widgets)视为相同,并且可以使用盒模型样式(参考助手:Customizing Qt Widgets Using Style Sheets中The Box Model部分)。

参考助手:Qt Style Sheets Reference中List of Sub-Controls部分,及Qt Style Sheets Examples中Customizing the QPushButton's Menu Indicator Sub-Control部分。

注意:对于复杂的部件,如:QComboBox和QScrollBar,如果一个属性或子控件被定制,所有其它属性或子控件必须被定制好。

伪选择器

选择器可以包含伪状态,意味着限制基于部件状态的应用程序规则。伪状态出现在选择器后面,用冒号(:)关联。例如,鼠标划过按钮:

QPushButton:hover { color: white }

伪状态可以用感叹号(!)运算符表示否定。例如,当鼠标不划过QRadioButton:

QRadioButton:!hover { color: red }

伪状态可以连接使用,这种情况下,相当于隐含了一个逻辑与。例如,当鼠标滑过选中的QCheckBox:

QCheckBox:hover:checked { color: white }

否定的伪状态也可以连接使用,例如,当鼠标划过一个非按下时按钮:

QPushButton:hover:!pressed { color: blue; }

如果需要,也可以使用逗号操作来表示逻辑或:

QCheckBox:hover, QCheckBox:checked { color: white }

伪状态也可以与子控件组合,例如:

QComboBox::drop-down:hover { image: url(dropdown_bright.png) }

参见助手:Qt Style Sheets Reference中List of Pseudo-States部分。

解决冲突

当样式中指定相同的属性具有不同的值时,就会出现冲突。例如:

QPushButton#okButton { color: gray }
QPushButton { color: red }

两个规则匹配objectName为okButton的QPushButton实例,color属性有冲突。要解决这个冲突,必须考虑到的选择器的特殊性。上面的例子,QPushButton#okButton被认为比QPushButton更具体,因为它通常是指单个对象,而不是一类的所有实例。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

同样的,利用伪状态比不指定伪状态那些选择器更具体。因此,下面的样式指定一个QPushButton应该有鼠标悬停文本白色,否则文本红色效果:

QPushButton:hover { color: white }
QPushButton { color: red }

这里有一个复杂的:

QPushButton:hover { color: white }
QPushButton:enabled { color: red }

这里,两个选择器有相同的特殊性,如果鼠标在按钮上时,第二条规则优先。如果在这种情况下我们想要白色文本,需要重新排序规则:

QPushButton:enabled { color: red }
QPushButton:hover { color: white }

或者,可以使第一条规则更加具体:

QPushButton:hover:enabled { color: white }
QPushButton:enabled { color: red }

类似的问题出现在类型选择器一起使用。请看下面的例子:

QPushButton { color: red }
QAbstractButton { color: gray }

两个规则应用于QPushButton实例(因为QPushButton继承自QAbstractButton)并有color属性的冲突。因为QPushButton继承QAbstractButton,所以QPushButton比QAbstractButton更具体。

然而,对于QSS的计算,所有的类型选择具有相同的特殊性,最后出现的规则优先。换句话说,所有的QAbstractButton颜色设置为灰色(包括QPushButton)。如果需要设置QPushButtons为红色文字,我们总能重新排序规则。

为了确定一个规则的特殊性,QSS遵循CSS2规范:

一个选择器的特殊性的计算方法如下:

  • 计算选择器中ID属性的数量(= a)
  • 计算选择器中伪状态类和其它属性的数量(= b)
  • 计算选择器中元素名的数量(= c)
  • 忽略伪元素(即子控件)。

串联的三个数字a-b-c(在具有大基数的数字系统)给出的特殊性。

一些例子:

*             {}  /* a=0 b=0 c=0 -> specificity =   0 */
LI            {}  /* a=0 b=0 c=1 -> specificity =   1 */
UL LI         {}  /* a=0 b=0 c=2 -> specificity =   2 */
UL OL+LI      {}  /* a=0 b=0 c=3 -> specificity =   3 */
H1 + *[REL=up]{}  /* a=0 b=1 c=1 -> specificity =  11 */
UL OL LI.red  {}  /* a=0 b=1 c=3 -> specificity =  13 */
LI.red.level  {}  /* a=0 b=2 c=1 -> specificity =  21 */
#x34y         {}  /* a=1 b=0 c=0 -> specificity = 100 */

级联效应

QSS可以在QApplication、父部件、子部件中设置。任意部件的有效样式表通过合并部件的祖先(父亲,祖父等)以及任何QApplication上设置的样式表。

冲突发生时,不论冲突规则的特殊性,部件自身的样式表总优先于任何继承样式表。同样,父窗口部件样式表优先于祖父等。

这样,一个部件设置样式自动使得它比在祖先部件或QApplication的样式表中指定的其它规则的优先级高。考虑下面的例子。首先,我们在QApplication中设置样式表:

qApp->setStyleSheet("QPushButton { color: white }");

然后,我们设置QPushButton的样式表:

myPushButton->setStyleSheet("* { color: blue }");

QPushButton样式表强制QPushButton(以及任何子部件)显示蓝色文字,尽管应用程序范围内的样式表提供的规则更具体。

如果按照下面这种方式写,其结果是相同的:

myPushButton->setStyleSheet("color: blue");

但如果QPushButton有孩子(不太可能),样式表就不会对它们有效果。

样式表级联是一个复杂的话题。请参考CSS2 Specification,要知道目前Qt没有实现。

继承性

在经典的CSS中,当字体和颜色没有明确设置时,它就会自动从父继承。当使用QSS时,部件不会自动从父继承字体和颜色。

例如,一个QGroupBox中包含QPushButton:

qApp->setStyleSheet("QGroupBox { color: red; } ");

QPushButton没有一个明确的颜色设置,因此,不是继承其父QGroupBox的颜色,而是显示系统的颜色。如果要建立一个QGroupBox及其孩子的颜色,可以这样写:

qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");

相比之下,可以用QWidget::setFont() 和 QWidget::setPalette()为子部件设置字体和画板 。

Namespaces中的部件

类型选择器可用于某一特定类型的部件。例如:

class MyPushButton : public QPushButton {
    // ...
}

// ...
qApp->setStyleSheet("MyPushButton { background: yellow; }");

QSS使用部件的QObject::className()来确定何时应用类型选择器。当自定义的部件在命名空间中时,QObject::className()返回<namespace>::<classname>。这与子控件的语法冲突。为了解决这个问题,当命名空间内的部件使用类型选择器时,必须更换”::” 为 “–”。 例如:

namespace ns {
    class MyPushButton : public QPushButton {
        // ...
    }
}

// ...
qApp->setStyleSheet("ns--MyPushButton { background: yellow; }");

设置对象属性

从4.3及以后,任何可被识别的Q_PROPERTY都可以使用qproperty-<property name>语法设置。

例如:

MyLabel { qproperty-pixmap: url(pixmap.png); }
MyGroupBox { qproperty-titleColor: rgb(100, 200, 100); }
QPushButton { qproperty-iconSize: 20px 20px; }

如果属性引用Q_ENUMS声明的枚举,则应该参考其常量的名字,而不是数值。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

原文链接:https://www.cnblogs.com/whwywzhj/p/9436948.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 之 QSS(样式表语法) 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • Matlab:筛选满足指定条件的数组元素

    Matlab 筛选满足指定条件的数组元素 在Matlab中 我们可以使用一些函数来筛选满足特定条件的数组元素 这些函数包括 find logical 和 indexing 等 下面以一个简单的实例来说明如何查找符合条件的数组元素 假设有一个
  • 判断应用或Activity是否存在

    一 判断应用是否存在 方法一 通过usb连接的方式 使用adb命令查看已安装的文件列表 adb shell pm list package 然后通过查看列表里是否含有对应的应用名来判断是否安装某应用 列表如下 adb shell pm li
  • Qt 数据类型转换 QString转Quint16

    如使用了QString存储用户输入的数据 数据类型 指的是quint16 qint16 float quint32 qint32等 可供用户自己选择的 而最终要使用的数据类型是quin16 下面是各种类型的转换 一 QString strV
  • Apache commons exec框架的简介说明

    转自 Apache commons exec框架的简介说明 下文笔者讲述Apache commons exec框架的简介说明 如下所示 Apache commmons exec框架的功能 Apache commons exec框架是对 Pr
  • Linux进程间通信——使用匿名管道

    本文介绍另一种进程间通信的方式 匿名管道 通过它进程间可以交换更多有用的数据 一 什么是管道 如果你使用过Linux的命令 那么对于管道这个名词你一定不会感觉到陌生 因为我们通常通过符号 来使用管道 但是管理的真正定义是什么呢 管道是一个进
  • SVG生成页面水印

    svg生成页面水印 灰信网 软件开发博客聚合
  • ElasticSearch基本操作

    文章目录 1 ElasticSearch 简介 2 索引库操作 2 1 mapping 属性 2 2 索引库CRUD 3 文档操作 3 1 新增文档 3 2查询文档 3 3删除文档 3 4修改文档 4 RestClient 4 1准备工作
  • C/C++静态变量static详解

    静态变量作用范围在一个文件内 程序开始时分配空间 结束时释放空间 默认初始化为0 使用时可以改变其值 静态变量或静态函数只有本文件内的代码才能访问它 它的名字在其它文件中不可见 用法1 函数内部声明的static变量 可作为对象间的一种通信
  • 数据挖掘 NO.1 数据挖掘入门

    1 机器学习 代价函数 m是样本数量 直到最后得到的值收敛或者样本使用完 1 定义代价函数 2 对每个参数求偏导数 3 使用梯度下降算法更新 数据集先开始进行划分 解决OVERFITTING 1 在测试集评估模型 2 Regelizatio
  • Hibernate之多对多级联查询、新增、删除

    以书籍与书籍类别为例 一本书可以有多种类型 一种类型也可以对应多本书 书籍和书籍类别的关系是多对多的关系 他们的关系是在中间表里面的 多对多通过一个表找到另一个表的数据的条件为 中间表 中间表对应本表的外键 中间表对应关联表的外键 注 多对
  • 使用picgo配置图床使用

    图床这种东西 做博客是必须要的 这里我记录目前我使用的几种图床 方便以后使用 以后有新的好用的 也会相应的更新 sm ms图床 免费的sm sm ms图床 好用 速度还可以 下面图片是sm图 可以感受一下速度 csdn图床 csdn这个社区
  • 【裸机开发】I2C 通信接口(二)—— I2C 寄存器解析

    目录 一 硬件原理图分析 二 IO 复用寄存器解析 三 I2C 寄存器解析 3 1 时钟配置 3 2 I2C1 IADR 设置从机地址 3 3 I2C1 IFDR 设置分频值 3 4 I2C1 I2CR I2C使能 中断控制 3 5 I2C
  • ArcPy批量计算栅格数据平均值

    遥感数据处理系列 一些项目及科研中遇到的小需求 一方面记录自己的学习历程 另一方面帮助大家学习 本系列文章的开发环境为 ArcGIS 10 2 2 Python 2 7 ENVI 5 3 IDL 8 5 ArcPy批量计算栅格数据平均值 G
  • Keil C51从汇编跳转到main函数编译器报错ERROR L127: UNRESOLVED EXTERNAL SYMBOL的解决办法

    51单片机系列教程主仓库地址 https gitee com langcai1943 8051 from boot to application 遇到的问题1 如果你自建的汇编原文件不是以Keil默认的 A51或者 s S结尾 而是以 as
  • 华为手机连电脑当摄像头用_华为手机摄像头还能这样用!300页文档轻松电子化,堪称职场法宝...

    华为手机摄像头还能这样用 300页文档轻松电子化 堪称职场法宝 我们生活中经常会使用相机记录一些美好的瞬间 可是你知道吗 华为手机摄像头还能这样用 300页的纸质文档可轻松电子化 堪称职场法宝 使用过华为手机的朋友们 应该都知道华为手机的拍
  • 三极管使用详解

    扣扣技术交流群 460189483 PNP型的三极管使用方法 常见的三极管为9012 s8550 9013 s8050 单片机应用电路中三极管主要的作用就是开关作用 其中9012与8550为pnp型三极管 可以通用 其中9013与8050为
  • Ubuntu需要运行networkmanager的解决方法

    问题 在使用ubuntu时无法联网 打开网络设置发现如下情况 解决方法 打开终端 输入su 获取管理员权限 然后输入systemctl start NetworkManager service 完成后即可正常联网了 新问题 每次开机后都需要
  • 元器选型攻略之 电感

    电子元器件领域电阻 电容 电感被称为 三剑客 其中电感又被称为 渣男 什么是电感 提到电感 离不开电感线圈这个名词 即用绝缘导线绕制而成的电磁感应元件 要理解电感 首先了解几个名词 感生 变化 改变 让我们回到高中课本 1 当一个导体相对磁
  • 论文笔记:Deep Representation Learning for Trajectory Similarity Computation

    ICDE 2018 1 intro 1 1 背景 用于计算轨迹相似性的成对点匹配方法 DTW LCSS EDR ERP 的问题 轨迹的采样率不均匀 如果两个轨迹表示相同的基本路径 但是以不同的采样率生成 那么这些方法很难将它们识别为相似的轨
  • Qt 之 QSS(样式表语法)

    简述 Qt样式表 以下统称QSS 的术语和语法规则几乎和CSS相同 如果你熟悉CSS 可以快速浏览以下内容 样式规则 QSS包含了一个样式规则序列 一个样式规则由一个选择器和声明组成 选择器指定哪些部件由规则影响 声明指定哪些属性应该在部件