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/bicheng/47095.shtml

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

相关文章

python基础知识点(蓝桥杯python科目个人复习计划70)

继续打基础&#xff0c;爬虫部分随笔 第一题&#xff1a;特别数的和 题目描述&#xff1a; 小明对数位中含有2、0、1、9的数&#xff08;不包含前导0&#xff09;很感兴趣&#xff0c;在1到40中这样的数共有28个&#xff0c;它们的和是574。 请问在1到n中&#xff0c;这样的…

提高Java程序效率:ImmutableList、Stream API 和 JSON序列化实战指南

常用列表构建方法&#xff1a; 1.ImmutableList.of() &#xff1a; 静态方法、不可变的列表 可以接受任意数量的参数&#xff0c;并将它们作为元素添加到新创建的列表中&#xff0c;但是一旦创建&#xff0c;集合的内容就不能被改变。在多线程环境中非常有用&#xff0c;因为…

Linux编程(通信协议---udp)

UDP&#xff08;用户数据报协议&#xff09;是一种无连接的网络协议&#xff0c;主要用于快速传输数据。以下是UDP协议的一些主要特点&#xff1a; 1. **无连接**&#xff1a;UDP是无连接的协议&#xff0c;这意味着在数据传输之前不需要建立连接。每个UDP数据包都是独立的&am…

OpenSearch分析CloudTrail日志的实用案例

在AWS环境中,CloudTrail日志提供了宝贵的洞察,而OpenSearch则为分析这些日志提供了强大的工具。本文将介绍15个使用OpenSearch分析CloudTrail日志的实用案例,帮助您更好地理解和管理AWS环境。 1. 监控用户登录活动 查询: eventName: "ConsoleLogin" 这个查询可…

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…

把关键字当作列名 不报错的方法 (数据库)

解决方法&#xff1a; 把新字段名加上双引号 ALTER TABLE 表名 RNAME COLUMN 旧列名 TO “新列名”在这个语句中&#xff0c;“新列名” 被双引号包围&#xff0c;这样数据库就能识别它作为一个标识符(例如列名)&#xff0c;而不是一个 SQL 关键字。

Django相关的基本操作

Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。以下是Django使用方法的基本步骤&#xff0c;涵盖了从安装到项目部署的整个过程&#xff1a; 1. 安装Django 首先&#xff0c;你需要在你的Python环境中安装Django。可以通过pip命令来安装&a…

win10删除鼠标右键选项

鼠标右键菜单时&#xff0c;发现里面的选项特别多&#xff0c;找一下属性&#xff0c;半天找不到。删除一些不常用的选项&#xff0c;让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键&#xff0c;调出“运行”对话框&#xff0c;输入“regedit”命令&#xff0c;点击…

探索Transformer:依存句法分析的新纪元

探索Transformer&#xff1a;依存句法分析的新纪元 依存句法分析是自然语言处理&#xff08;NLP&#xff09;领域中的一项基础任务&#xff0c;它旨在揭示句子中词语之间的依存关系。近年来&#xff0c;Transformer模型以其卓越的性能在依存句法分析领域引起了一场革命。本文将…

opencv—常用函数学习_“干货“_1

目录 一、图像文件 1. imread&#xff1a;读取图像文件 2. imwrite&#xff1a;写入图像文件 3. imshow&#xff1a;显示图像 4. VideoCapture&#xff1a;捕获视频 二、创建Mat 1、创建Mat对象 2、操作Mat对象 三、矩阵算术运算 矩阵加法 矩阵减法 矩阵乘法 矩阵…

linux后门教程

linux后门教程 alias 用法 系统默认别名&#xff1a;alias 设置别名&#xff1a;alias lsls -laih 删除别名&#xff1a;unalias ls **加参数&#xff1a;**alias ls‘ls -laih;pwd’ 注意 系统启动默认加载的配置文件 /etc/profile 切换用户就会执行/etc/profile /etc/bash…

Python 实验五 高级数据结构

一、实验目的 &#xff08;1&#xff09;掌握序列的基本操作 &#xff08;2&#xff09;掌握集合、字典的基本操作 二、实验环境 联网计算机一台/每人&#xff0c;内装Windows 7以上操作系统和安装Python 3.7集成开发环境IDLE。 三、实验内容 Sy5-1 列表实现。编写一个…

minIO集成springboot

问题 minIO与spring集成。 步骤 创建桶 创建key 找到创建账号页面&#xff0c;如下图&#xff1a; 点击创建&#xff0c;如下图&#xff1a; 设置如下权限&#xff1a; {"Version": "2012-10-17","Statement": [{"Effect": &q…

Google 地图参考手册

Google 地图参考手册 引言 Google 地图作为全球最受欢迎的地图服务之一,不仅提供了详细的地理信息和导航服务,还整合了丰富的商业信息、用户评价和街景视图。本手册旨在为用户提供一个全面而深入的Google地图使用指南,帮助用户更好地利用这一强大的工具。 目录 Google 地…

codeforces round 948 div2(a,b,c)

题目链接 A #include<bits/stdc.h>using namespace std;#define int long long #define PII pair<int,int>void solve() {int n,m;cin>>n>>m;if(n&1){if((m&1)&&m>1&&m<n)cout<<"YES"<<\n;else…

HDFS和FDFS

HDFS&#xff08;Hadoop Distributed File System&#xff09;和FDFS&#xff08;FastDFS&#xff09;是两种不同的分布式文件系统&#xff0c;它们各自有不同的设计目标和使用场景。以下是对它们的详细介绍&#xff1a; HDFS&#xff08;Hadoop Distributed File System&…

树莓派docker自制镜像

挂载img文件到目录 cd /a/img tar -czvf rr.tar.gz ./ docker import tt.tar.gz rootpi:/home/pi/2# docker tag ff142da9042f arm7:v01 rootpi:/home/pi/2# docker images REPOSITORY TAG IMAGE ID CREATED SIZE arm7 …

python的异常

异常 定义 异常是程序执行中发生的错误事件&#xff0c;它可以打断正常的指令流。Python提供了强大的异常处理机制&#xff0c;允许程序在发生错误时执行某些替代指令&#xff0c;而不是直接崩溃。 类型 TypeError&#xff1a;类型错误&#xff0c;比如尝试将字符串和整数相加。…

vue3 学习笔记13 -- 生命周期和防抖节流

vue3 学习笔记13 – 生命周期和防抖节流 生命周期 创建周期&#xff08;Composition API&#xff09; setup(): 这不是生命周期钩子&#xff0c;但它是组合API的入口点&#xff0c;用于执行任何启动逻辑。 更新周期 onBeforeMount(): 在组件挂载之前调用&#xff0c;此时虚拟…

音视频开发入门教程(1)如何安装FFmpeg?共210节

安装FFmpeg的具体步骤会根据你使用的操作系统而有所不同。以下是Windows和Linux系统上安装FFmpeg的基本步骤&#xff1a; Windows系统 下载FFmpeg安装包&#xff1a; 访问FFmpeg的官方网站&#xff1a;FFmpeg。点击页面上方的“Download”按钮。在下载页面&#xff0c;找到适…