Qt Style Sheets-样式表语法

样式表语法

        Qt 样式表术语和语法规则几乎与 HTML CSS 的相同。如果您已经了解 CSS,您可能可以快速浏览此部分。

样式规则

        样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些小部件受该规则影响;声明指定应在小部件上设置哪些属性。例如:

QPushButton { color: red }

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

        Qt 样式表通常不区分大小写(即 colorColorCOLOR 和 cOloR 指的是相同的属性)。唯一的例外是类名、对象名 和 Qt 属性名,它们区分大小写。

        多个选择器可以为同一个声明指定,使用逗号(,)来分隔选择器。例如,规则

QPushButton, QLineEdit, QComboBox { color: red }

        相当于以下这三条规则的序列:

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

        样式规则的声明部分是一系列property: value对,括在花括号({})中,并以分号分隔。例如:

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

        请查看下面的属性列表部分,以获取 Qt 控件提供的属性列表。

选择器类型

选择器类型
选择器示例解释实例代码
通用选择器*匹配所有小部件。
* { background-color: red; }///< 通用选择器:设置所有控件的背景颜色为红色

类型选择器QPushButton匹配 QPushButton 及其子类的实例。
QWidget { background-color: red; }///< 将应用样式到所有的 QWidget 类型的部件上,将背景颜色设置为红色。

属性选择器QPushButton[flat="false"]

匹配不是扁平的QPushButton实例。您可以使用此选择器来测试支持QVariant::toString()的任何 Qt属性(有关详细信息,请参阅toString()函数文档)。此外,还支持特殊的class属性,用于类的名称。

此选择器还可用于测试动态属性。有关使用动态属性进行自定义的更多信息,请参阅使用动态属性进行自定义。

与其使用=,您还可以使用~=来测试类型为QStringList的 Qt 属性是否包含给定的QString。

警告:如果在设置样式表后 Qt 属性的值发生更改,可能需要强制重新计算样式表。实现此目的的一种方法是取消设置样式表然后再次设置。

QWidget[focus = true] { background-color: red; }///< 当 QWidget 具有 focus 属性且值为 true 时,应用背景颜色为红色的样式。
QPushButton[enabled = false] { color: gray; }///< 当 QPushButton 的 enabled 属性为 false ,将其文字颜色设置为灰色。

类选择器.QPushButton

匹配 QPushButton 的实例,但不包括其子类。

这等同于 *[class~="QPushButton"] 。

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

id选择器QPushButton#okButton匹配所有QPushButton实例,其对象名称为okButton
#include <QApplication>
#include <QPushButton>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton button;button.setObjectName("myButton");button.setStyleSheet("#myButton { color: blue; font-size: 16px; }");button.show();return a.exec();
}

派生类选择器QDialog QPushButton匹配所有作为QDialog的后代(子节点、孙节点等)的QPushButton实例。
子选择器QDialog > QPushButton匹配所有作为 QDialog 的直接子元素的 QPushButton 实例。

 子控件

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

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

        上述规则为所有QComboBox的下拉按钮设置样式。尽管双冒号(::)语法让人想起 CSS3 伪元素,但 Qt 子控件在概念上与这些不同,并且具有不同的级联语义。

         子控件始终相对于另一个元素(即参考元素)进行定位。此参考元素可以是小部件或另一个子控件。例如,默认情况下,“下拉列表”在“QComboBox”的填充矩形的右上角。默认情况下,“下拉列表”位于“下拉列表”子控件的内容矩形的中心。有关用于设置小部件样式的子控件及其默认位置,请参阅下面的“可设置样式的小部件列表”。

        可使用子控件原点属性更改要使用的原始矩形。例如,如果我们希望将下拉列表放置在QComboBox的边距矩形中,而不是默认的填充矩形中,我们可以指定:

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

        在 Margin 矩形内下拉列表的对齐方式使用子控件位置属性进行更改。

        宽度和高度属性可用于控制子控件的大小。请注意,设置图像会隐式设置子控件的大小。

         相对定位方案(位置:相对),允许子控件的位置偏离其初始位置。例如,当按下QComboBox的下拉按钮时,我们可能希望内部的箭头偏移以产生“按下”效果。要实现此目的,我们可以指定:

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

        绝对定位方案(位置:绝对)允许子控件的位置和大小相对于参考元素进行更改。

        一旦定位,它们就与小部件一样被对待,并且可以使用盒模型进行样式设置。

        请查看下面的子控件列表以获取受支持的子控件列表,以及自定义 QPushButton 的菜单指示器子控件以获取实际示例。

        注意:对于复杂的小部件,如QComboBox和QScrollBar,如果自定义了一个属性或子控件,那么所有其他属性或子控件也必须进行自定义。

伪状态

        选择器可能包含伪状态,这些伪状态表示根据小部件的状态限制规则的应用。伪状态出现在选择器的末尾,中间有一个冒号(:)。例如,当鼠标悬停在QPushButton 上时,以下规则适用:

QPushButton:hover { color: white }

        伪状态可以使用感叹号运算符进行取反。例如,当鼠标未悬停在QRadioButton 上时,以下规则适用:

QRadioButton:!hover { color: red }

        伪状态可以链接,在这种情况下意味着逻辑“与”。例如,以下规则适用于鼠标悬停在已选中的QCheckBox 上时:

QCheckBox:hover:checked { color: white }

        否定的伪状态可能出现在伪状态链中。例如,当鼠标悬停在未按下的QPushButton上时,以下规则适用:

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

        如果需要,逻辑或可以使用逗号运算符来表示:

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

        伪状态可以与子控件组合出现。例如:

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

        请查看下面的伪状态列表部分,以获取 Qt 小部件提供的伪状态列表。

冲突解决

        当多个样式规则指定相同的属性但具有不同的值时会产生冲突。考虑以下样式表:

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

        这两条规则都匹配名为 QPushButton 的实例,称为 okButton,并且对于 color 属性存在冲突。为了解决此冲突,我们必须考虑选择器的特异性。在上述示例中,QPushButton#okButton 被认为比 QPushButton 更具特异性,因为它(通常)指的是单个对象,而不是类的所有实例。

        同样,具有伪状态的选择器比未指定伪状态的选择器更具特异性。因此,以下样式表指定当鼠标悬停在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),并且对于颜色属性存在冲突。由于QPushButton继承QAbstractButton,可能会让人误以为QPushButtonQAbstractButton更具体。然而,对于样式表计算,所有类型选择器具有相同的特异性,最后出现的规则优先。换句话说,颜色被设置为gray对于所有QAbstractButton,包括QPushButton。如果我们确实希望QPushButton具有红色文本,我们总是可以重新排列规则。

一个选择器的特异性计算如下:

  1. 计算选择器(= a)中 ID 属性的数量
  2. 计算选择器(= b)中其他属性和伪类的数量
  3. 计算选择器(= c)中元素名称的数量
  4. 忽略伪元素(例如,子控件)。

将三个数字 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 */

级联

        样式表可以在QApplication、父部件和子部件上设置。任意部件的有效样式表是通过合并设置在该部件的祖先(父部件、祖父部件等)上的样式表以及在QApplication上设置的任何样式表获得的。

        当冲突出现时,小部件自身的样式表总是优先于任何继承的样式表,无论冲突规则的特异性如何。同样,父部件的样式表优先于祖父部件的样式表,等等。

        其中一个后果是,在小部件上设置样式规则会自动使其优先于在祖先小部件的样式表或QApplication样式表中指定的其他规则。考虑以下示例。首先,我们在QApplication上设置样式表:

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

        然后我们在一个QPushButton对象上设置一个样式表:

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

        如果我们已经写了,结果会是一样的

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

        只是如果QPushButton有子元素(这不太可能),样式表对它们将没有影响。

        样式表级联是一个复杂的主题。请参考CSS2 规范以获取详细信息。请注意,Qt 目前尚未实现!important

继承

        在经典的 CSS 中,当一个项目的字体和颜色未明确设置时,它会自动从父项继承。在使用 Qt 样式表时,一个小部件不会自动从其父部件继承其字体和颜色设置。

        例如,考虑在QGroupBox 内的QPushButton :

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

        QPushButton 未设置明确的颜色。因此,它没有继承其父QGroupBox的颜色,而是采用了系统颜色。如果我们要为QGroupBox及其子元素设置颜色,可以这样写:

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

        相比之下,设置字体并使用QWidget::setFont() 和 QWidget::setPalette() 进行传播会传播到子部件。

命名空间中的小部件

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

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

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

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

设置 QObject 属性

        从 4.3 及以上版本开始,任何可设计的Q_PROPERTY都可以使用 qproperty-<属性名称>语法进行设置。

        例如:

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

        如果属性引用使用 Q_ENUMS 声明的枚举,您应该通过名称引用其常量,即,不是它们的数值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP6事件系统使用指南

本文由 ChatMoney团队出品 在ThinkPHP 6中&#xff0c;事件系统提供了一种优雅的方式来实现解耦和动态响应。你可以通过注册事件和对应的监听者来处理各种应用逻辑。 事件注册 闭包注册 闭包是最简单的事件监听者&#xff0c;可以直接在注册时定义。 Event::listen("C…

Linux操作系统之多文件管理

makefile: makefile文件用于管理和组织代码工程的编译和链接,被make工具解析并完成相关动作 make: 工程管理工具 语法: 要生成的文件:依赖的所有文件 时间戳: 编译文件时,时间戳更新的文件需要重新加入编译,时间戳没有改变的不需要重新编译 app:main.c add.c sub.c …

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了&#xff0c; 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层&#xff0c;如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法&#xff1a;查看dmesg日志有报错&#xff1a;k…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求&#xff1a;勇敢地对不合理的需求说不系统架构&#xff1a;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引&#xff1a;根据需求编写良…

C# 实体更新记录:如何捕获和记录字段变化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 简称BB)是一种求解整数规划问题的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;详解与Python代码示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 简称B&B&#xff09;是一种求解整数规划问题的有效算法。它结合了搜索与迭代的思想&#xff0c;通过系统地枚举候选解来寻找最优解。在…

Java Web常见框架寻找路由技巧

在Java Web代码审计中&#xff0c;寻找和识别路由是很关键的部分。通过注册的路由可以找到当前应用对应的Controller&#xff0c;其作为MVC架构中的一个组件&#xff0c;可以说是每个用户交互的入口点。简单介绍下Java Web中常见框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模块化语法

目录 一、use 1、命名空间 2、私有变量 3、用with改变模块中的默认值 二、forward 1、给forward模块起别名&#xff0c;让成员加前缀 2、利用hide or show手动控制成员的可访问性 三、import 1、不存在命名空间&#xff0c;成员变量在import之后直接公开 2、可以在嵌…

springboot防止重复提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表单重复提交有多种策略&#xff0c;以下是几种常见且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按钮&#xff1a;在表单提交后&#xff0c;使用JavaScript立即禁用提交按钮&#xff0c;防止用户再次点击。响应式提示&#x…

十、Java集合 ★ ✔(模块18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比较器排序、Collections、可变参数、Map】

day05 泛型,数据结构,List,Set 今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 ★ 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型…

讲真,现在留给2024年下半年软考的时间还够吗?

常识是个好东西&#xff0c;但是有时候却容易蒙蔽咱们的双眼&#xff0c;就拿下半年软考而言&#xff0c;看起来现在才7月份&#xff0c;刚刚入伏&#xff0c;考试要到11月份&#xff0c;是冬天呢&#xff0c;中间还隔了一个完整的秋季&#xff0c;常识感觉还很遥远&#xff0c…

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …

对LinkedList ,单链表和双链表的理解

一.ArrayList的缺陷 二.链表 三.链表部分相关oj面试题 四.LinkedList的模拟实现 五.LinkedList的使用 六.ArrayList和LinkedList的区别 一.ArrayList的缺陷: 1. ArrayList底层使用 数组 来存储元素&#xff0c;如果不熟悉可以来再看看&#xff1a; ArrayList与顺序表-CSDN…

一些常见的网络故障

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

【数据分析】Python数据分析实战:从零开始构建数据管道

Python数据分析实战&#xff1a;从零开始构建数据管道 引言一、数据获取二、数据清洗三、数据分析四、数据可视化五、案例研究&#xff1a;预测股票价格结论 我尝试访问您所提供的链接&#xff0c;但似乎该链接指向的内容已失效或被移除&#xff0c;因此无法直接获取并阅读该文…

【iOS】——ARC源码探究

一、ARC介绍 ARC的全称Auto Reference Counting. 也就是自动引用计数。使用MRC时开发者不得不花大量的时间在内存管理上&#xff0c;并且容易出现内存泄漏或者release一个已被释放的对象&#xff0c;导致crash。后来&#xff0c;Apple引入了ARC。使用ARC&#xff0c;开发者不再…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查壳&#xff0c;本题是32位&#xff0c;有壳&#xff0c;进行脱壳。 第二步 这里的 jnz 指令会实现一个跳转&#xff0c;并且下面的0EC85D78Bh被标红了&#xff0c;应该是一个不存在的地址&#xff0c;这些东西就会导致IDA无法正常反汇编出原始代码&#xff0c;也称…

中文科技核心论文发表

中文科技核心论文题目如下&#xff1a; 1.混凝土结构用纤维增强塑料筋的耐久性评述&#xff1a;适合建筑、结构、材料等专业 2.建筑工程用阻燃塑料的研究进展&#xff1a;适合建筑、材料专业 3.纤维增强热塑性塑料在面部护具中的应用研究&#xff1a;适合化工、医学、材料等专…

springcloud2021.x使用nacos做配置中心

spirngcloud2021.0.5使用nacos做配置中心遇到的问题 环境 jdk1.8&#xff0c;spring-boot 2.6.13&#xff0c;spring-cloud-alibaba 2021.0.5.0 &#xff0c;spring-cloud 2021.0.5 方案一 application.properties # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts…

C++中的condition_variable:条件变量

理解 C 中的条件变量&#xff08;Condition Variable&#xff09; 在多线程编程中&#xff0c;我们常常需要一个线程等待某个条件的变化&#xff0c;比如等待数据的生成或某个标志位的设置。如果没有条件变量&#xff08;condition_variable&#xff09;&#xff0c;线程可能会…