QSS 语法

article/2025/9/28 23:42:48

目录

  • 1. 基本语法
    • 1.1 样式规则
    • 1.2 选择器、声明
    • 1.3 大小写
    • 1.4 多个选择器
  • 2. 选择器
    • 2.1 通用选择器:*
    • 2.2 类型选择器:QPushButton
    • 2.3 属性选择器:QPushButton[flat="false"]
    • 2.4 类选择器:.QPushButton
    • 2.5 ID 选择器:QPushButton#okButton
    • 2.6 后代选择器:QDialog QPushButton
    • 2.7 直接子代选择器:QDialog > QPushButton
  • 3. 子控件
    • 3.1 一个简单示例
    • 3.2 子控件参考矩形
    • 3.3 子控件对齐方式
    • 3.4 子控件大小
    • 3.5 子控件相对位置、绝对位置
  • 4. 伪状态
  • 5. 解决冲突
    • 5.1 产生冲突的原因
    • 5.2 解决冲突方法1:更具体的选择器
    • 5.3 解决冲突方法2:相同优先级的选择器,位于下方的优先级高
    • 5.4 优先级计算
  • 6. 级联(Cascading)
  • 7. 继承
    • 7.1 CSS 中的继承
    • 7.2 QSS 中的继承
  • 8. 命名空间中的 widget
  • 9. 设置 QObject 属性


1. 基本语法

1.1 样式规则

QSS 由样式规则组成。以下是 3 条规则:
样式规则

1.2 选择器、声明

样式规则 = 选择器+声明

1.3 大小写

QSS 不区分大小写,但类名对象名属性名例外!假设有一个名为 objectName 的 QPushButton:

1.4 多个选择器

可以将多个选择器设置同一个声明,使用逗号,分割:

QPushButton, QLineEdit, QComboBox { color: red; }

等价于:

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

2. 选择器

QSS 支持 CSS2 中定义的所有选择器。

2.1 通用选择器:*

匹配所有 widget。

2.2 类型选择器:QPushButton

匹配 QPushButton 及其子类。

2.3 属性选择器:QPushButton[flat=“false”]

匹配所有设置了 setFlat(false) 的 QPushButton。

使用该选择器既可以:1. 测试任何支持 QVariant::toString() 的 Qt 属性,还支持特殊的类属性,如类名;2. 还可以测试动态属性。

除了=,也可以使用~=来测试 QStringList 类型的 Qt 属性是否包含给定 QString。

注意:设置 qss 后,如果 Qt 属性值发生了变化,则需要强制重新计算 qss。方法是:重新设置 qss。

2.4 类选择器:.QPushButton

匹配 QPushButton,但不包括子类。等价于 *[class~="QPushButton"]

2.5 ID 选择器:QPushButton#okButton

匹配所有对象名为“okButton”的 QPushButton。

2.6 后代选择器:QDialog QPushButton

匹配作为 QDialog 的后代(直接子代、孙代)的 QPushButton。

2.7 直接子代选择器:QDialog > QPushButton

匹配作为 QDialog 的直接子级(即第一代)的 QPushButton。
在这里插入图片描述


3. 子控件

有些 widget 比较复杂,如 QComboBox 有下拉按钮、QSpinBox 有上下箭头,设置这些 widget 时可以指定子控件。

3.1 一个简单示例

例如:

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

3.2 子控件参考矩形

子控件始终相对于另一个元素定位。例如,QComboBox 的 ::drop-down 默认放置在 QComboBox 的 Padding 矩形的右上角。

使用 subcontrol-origin 更改参考矩形。例如,想将下拉菜单放置在 QComboBox 的 “margin 矩形” 中而不是 “padding 矩形” 中,可以这样设置:

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

3.3 子控件对齐方式

使用 subcontrol-position 更改 Margin 矩形中下拉菜单的对齐方式。

3.4 子控件大小

使用 widthheight 可以设置子控件的大小。

注意:如果设置了 image 会默认设置子控件的大小。

3.5 子控件相对位置、绝对位置

使用 position: relative 设置相对定位,允许子控件偏离初始位置。
使用 position: absolute 设置绝对定位,允许子控件相对于参考元素更改位置。

一旦使用了 position,子控件就被视为与 widget 相同,就可以使用盒模型设置。

注意:对于 QComboBox、QScrollBar 等复杂 widget,如果设置了某个属性、某个子控件,那么其他的属性、子控件也要设置。


4. 伪状态

伪状态是指 widget 的不同状态。

伪状态位于选择器的末尾,中间有一个冒号 :。例如,鼠标悬浮按钮时:

QPushButton:hover { color: white }

使用感叹号 ! 否定伪状态。例如,鼠标未悬浮按钮时:

QPushButton:!hover { color: red }

伪状态可以链接,此时默认隐含逻辑与。例如,鼠标悬停在选中的 QCheckBox 上时:

QCheckBox:hover:checked { color: white }

可以使用逗号 , 表示逻辑 OR:

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

伪状态可以与子控件一起出现。 例如:

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

5. 解决冲突

5.1 产生冲突的原因

如果匹配到同一个 widget 的同一个属性但却设置了不同值,就会产生冲突。例如:

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

两个规则都能匹配名为 okButton 的 QPushButton,但是设置了不同的文本色,这时就需要考虑 选择器的优先级

5.2 解决冲突方法1:更具体的选择器

例如:

  • QPushButton#okButton 比 QPushButton 优先级更高,因为它(通常)指的是单个对象,而不是类的所有实例。
  • 具有伪状态的选择器比不指定伪状态的选择器优先级更高。例如:
QPushButton:hover { color: white }
QPushButton { color: red }

当鼠标悬停在 QPushButton 上时文本为白色,否则为红色。

这是一个棘手的问题:

5.3 解决冲突方法2:相同优先级的选择器,位于下方的优先级高

一个示例,两个选择器优先级相同,但由于 enable 位于 hover 下方,因此优先级更高:

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

另一个示例:

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

虽然 QPushButton 是 QAbstractButton 的子类,似乎更具体,但对于样式表计算,所有类型选择器都具有相同的特性,并且最后出现的规则优先。因此,所有按钮颜色都设置为灰色,包括 QPushButtons。

5.4 优先级计算

Qt Style Sheet 遵循 CSS2 规范:

优先级计算规则:

  1. 计算选择器中 ID 属性的数量 a;
  2. 计算选择器中其他属性和伪类的数量 b;
  3. 计算选择器中元素名的数量 c;
  4. 忽略伪元素,如子控件;
  5. 最后,连接 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 */

6. 级联(Cascading)

widget 的 qss 继承 父widget。如果 widget 设置了自己的 qss,则优先级高于继承的 qss。

例如:

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

最终按钮的文本色为蓝色。

级联是一个很复杂的话题,请参阅 CSS2 Specification。
注意:Qt 没有实现 !imporant

7. 继承

7.1 CSS 中的继承

在经典 CSS 中,字体和颜色会自动从父项继承。

7.2 QSS 中的继承

注意:Qt Style Sheet 中的 widget 不会自动从其父部件继承字体和颜色

例如,QGroupBox 中有个 QPushButton。QPushButton 不会自动继承 QGroupBox 的颜色,而是使用系统颜色:

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

如果想为 QGroupBox 及其子对象设置颜色,可以这样写:

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

使用 QWidget::setFont()QWidget::setPalette() 设置字体和调色板会传播到子部件。

如果您希望字体和调色板传播到子小部件,可以设置 Qt::AA_UseStyleSheetPropagationInWidgetStyles 标志,如下所示:

QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);

当启用该功能时,通过 QSS 设置的字体和调色板变化时,其行为类似于调用 QWidget::setPalette()QWidget::setFont()。如果所调函数能在 C++ 中传播,则也就可以在 qss 中传播。

8. 命名空间中的 widget

类型选择器可用于为特定类型的 widget 设置样式。例如:

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

Qt Style Sheet 使用 widget 的 QObject::className() 来确定何时应用类型选择器。当自定义部件在命名空间内时,QObject::className() 返回 ::,这与子控件的语法冲突。为了克服这个问题,在命名空间内使用类型选择器时,我们必须将“::”替换为“--”。 例如:

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

9. 设置 QObject 属性

从 Qt 4.3 开始,可以使用 qproperty-<property name> 语法设置 Q_PROPERTY,例如:

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

如果该属性引用了一个用 Q_ENUMS 声明的枚举,您应该按名称引用它的常量,即,而不是它们的数值。

注意:请谨用 qproperty 语法,因为它会修改正在绘制的小部件。此外,qproperty 语法只评估一次,即当小部件被样式修饰时。这意味着在 QPushButton:hover 等伪状态下使用它们的任何尝试都将不起作用。


http://chatgpt.dhexx.cn/article/sBE3tKDi.shtml

相关文章

QSS(Qt样式表)概念

Qt样式表是一个可以自定义部件外观的十分强大的机制&#xff0c;除了QStyle更改的样式&#xff0c;其他的都可以由QSS修改。由于受到Html的CSS启发&#xff0c;所以叫QSS。 代码添加样式表ui界面上添加样式表 代码添加样式表&#xff1a; setStyleSheet&#xff08;&#xff0…

【QT】QSS使用总结

文章目录 主要流程&#xff1a;导入QSS文件&#xff1a;1. 添加Qt Resource File文件&#xff0c;输入名称2. 在工程文件目录下先建一个".txt"文件&#xff0c;重新命名后缀为".qss"3. 右键添加现有文件qss.qss4. 完成添加5. 将 qss样式应用到整个工程 QSS…

01_1_Qt工程实践_Qt样式表Qss(什么是QSS;基本语法;setStyleSheet函数;样式表的属性值;利用QtCreate实现样式切换;样式表实现皮肤改变实例)

本篇介绍什么是样式表&#xff0c;讨论如何使用Qt样式表Qss修改应用程序外观&#xff0c;并通过实例进行讲解。 了解HTML的同学都知道&#xff0c;一般在HTML中我们把样式表叫做CSS&#xff0c;在Qt中我们称之为QSS。QSS和CSS并不完全等同&#xff0c;语法完全类似&#xff0c…

【QT】QSS美化——基础知识

目录 一、辅助工具 二、QSS加载方式 三、QSS选择器类型 3.1 通配选择器 3.2 类型选择器 3.3 属性选择器 3.4 类选择器 3.5 ID选择器 3.6 后代选择器 3.7 子选择器 3.8 伪类选择器 四、QSS常用属性 4.1 字体 4.2 颜色 4.3 内边距 4.4 外边距 4.5 背景 4.6 边框…

在没有QQ、微信时局域网共享文件方法

1、首先开启共享 2、将要共享文件的电脑做同样操作 查看局域网下电脑 点击要访问的电脑输入该电脑的账号密码进行登录。 3、选择要共享的文件和访问权限 在要共享文件的电脑选择要共享的文件右键-授予访问权限-家庭组 然后选特定用户-everyone即可。 之后就是在这个文件里面…

分享:我的局域网QQ Bing(必应)1.0 正式发布,包括:聊天、视频、语音、电话、截屏、文件传输 等

分享&#xff1a;我的局域网QQ Bing&#xff08;必应&#xff09;1.0 正式发布,包括&#xff1a;聊天、视频、语音、电话、截屏、文件传输 等 百万商业圈 局域网QQ Bing&#xff08;必应&#xff09;1.0 正式发布 Bing&#xff08;必应&#xff09;是一款优秀的企业局域网即时…

交换机组建局域网

说来惭愧&#xff0c;今天才搞明白用交换机组建局域网的原理&#xff0c;这里介绍方法&#xff1a; 平时使用的路由器有交换机的功能&#xff0c;单纯使用交换机还是第一次&#xff1a; 1、将所有电bai脑连到同一台交换机上&#xff0c;du即将各台电zhi脑的网线插入同一dao台交…

基于JAVA的局域网聊天软件的设计与实现(仿制QQ)

一、系统分析 1.1 问题描述 客户端 实现简易版的局域网聊天器实现富文本内容聊天智能聊天机器人群发消息传送文件等功能 服务器端 实现群发通知管理聊天线程 1.2 系统功能分析 客户端功能 登陆注册发送表情消息发送文本消息截取图片图片处理震动效果发送文件群发消息设置聊天…

通过交换机组建局域网

实现目标&#xff1a;利用交换机搭建一个局域网&#xff0c;使得该局域网下同一网段的所有机器相互通信 所需设备&#xff1a;电脑一台&#xff0c;树莓派两个&#xff0c;工控机两台&#xff0c;TP-Link交换机一台。 该教程就以一台电脑和一台树莓派搭建局域网为一个demo&am…

PHPstudy配置局域网

PHPstudy配置局域网 1.打开小皮网站&#xff08;https://www.xp.cn/download.html&#xff09;&#xff0c;下载64位PHPstudy到电脑桌面 2.解压zip文件 3.打开解压后的文件夹&#xff0c;找到.exe文件&#xff0c;直接安装 4.安装好之后&#xff0c;开启Apache、FTP和MySQL 5…

局域网传输/共享大文件

局域网传输/共享大文件 前段时间和同学传一个4g的数据。想到如下几个点子 通过qq进行传输&#xff0c;但是要上传&#xff0c;还要下载&#xff0c;还要网速给力才行&#xff0c;而且花费的可是双倍的时间&#xff0c;一个上传一个下载&#xff0c;等的黄花菜都凉了。通过u盘…

局域网网站服务器dns设置,局域网设置dns的方法

DNS域名解析是指通过主机名得到该主机名对应的IP地址。BIND作为局域网上广泛使用的DNS服务器软件,通过对区文件的管理实现对DNS域名的授权和查询使用。下面是学习啦小编为大家整理的关于局域网设置dns怎么设置在哪,一起来看看吧! 局域网设置dns的方法 Windows 7相比于常用的Wi…

局域网传输文件_局域网微信?这是什么神仙玩法

前天我们刚好谈到局域网在观看各类资源时的作用。 那么就接着聊聊局域网的其他妙用。 今天无论在家还是在外&#xff0c;只要连接同一个 WiFi&#xff0c;大家的设备就在一个局域网内。 而相比微信、QQ 等需要中转服务器的聊天/办公工具。 局域网下&#xff0c;多台设备能够点对…

局域网下的两个 QQ 好友进行在线文件传输抓包

局域网下的两个 QQ 好友进行在线文件传输过程抓包 文章目录 局域网下的两个 QQ 好友进行在线文件传输过程抓包介绍细节总结 介绍 由于本人一个作业需要&#xff0c;想要验证内网情况下两个 QQ 好友的文件传输是通过局域网直接传输的。以下是本人的数据抓包结果&#xff0c;具体…

C# Socket编程实现简单的局域网聊天器

前言 最近在学习C# Socket相关的知识&#xff0c;学习之余&#xff0c;动手做了一个简单的局域网聊天器。有萌生做这个的想法&#xff0c;主要是由于之前家里两台电脑之间想要传输文件十分麻烦&#xff0c;需要借助QQ&#xff0c;微信或者其他第三方应用&#xff0c;基本都要登…

局域网传文件_秒杀QQ微信,这3个神器传输文件快10倍

所需软件&#xff1a;奶牛传输、Xender 获取办法&#xff1a;私信回复「301」获取 每次一聊到传输文件&#xff0c;学霸君的同事简直叫苦不迭“百度云下载速度太慢了&#xff01;一个文件&#xff0c;半个小时都下载不完”、“好久不用QQ&#xff0c;连密码都忘记了”、“微信…

简易局域网聊天QQ

简易局域网聊天系统–局域网QQ 服务器端 实现简易的启动停止服务器端操作&#xff0c;能记录基本日志&#xff1a;客户连接、消息传送&#xff0c;能查看连接客户的昵称。 启动服务器后开始监听客户端连接&#xff0c;创建一个新线程实现该监听操作。 // 启动新线程监听客户…

Win 7 SSDP 组播 引发 局域网 QQ掉线 分析

很久没有写博客了&#xff0c;自从四月份以来找了一份开发的工作开始从事PHP&#xff0c;symfony 网站开发&#xff0c;突然发现好像也没有什么东西可以分享了&#xff0c;所以博客也写的少了。 言归正传&#xff0c;最近学校常常有人抱怨QQ掉线&#xff0c;而且据说有严重的趋…

kali局域网扫描ip_kali 扫描局域网的QQ

扫描电脑端 方法一:抓包方式 相对于电脑端来说,很简单。因为电脑的QQ使用的是OICQ协议。我们只需要抓包搜索OICQ协议即可。 然后查找协议 OICQ - IM software, popular in China展开后即可看到QQ号码 方法二:利用软件 下载软件QQSNIFFER运行扫描

利用SWT做Java版局域网QQ(一)——基于UDP协议

首先自我介绍下,本人非专职IT人员、纯粹是IT爱好者,也并非计算机专业毕业的,所用的Java知识也全凭空闲时间学习的,所以在很多地方代码不够精炼,也只是能实现 一些功能吧,当然也参考了一些前辈的文档等。写此篇博客也纯粹是把自己学到的写写笔记而已。好了废话不多说,开始…