Qt样式表之二:QSS语法及常用样式
一、简述
Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同。如果你熟悉CSS,可以快速浏览以下内容。不熟悉的话可以先去W3School - CSS或者本人的CSS博客随笔简单了解一下。
在讲解样式表语法前,我们先看一个例子:
/*按钮普通态*/
QPushButton
{
    /*字体为微软雅黑*/
    font-family:Microsoft Yahei;
    /*字体大小为20点*/
    font-size:20pt;
    /*字体颜色为白色*/
    color:white;
    /*背景颜色*/
    background-color:rgb(14 , 150 , 254);
    /*边框圆角半径为8像素*/
    border-radius:8px;
}
/*按钮停留态*/
QPushButton:hover
{
    /*背景颜色*/
    background-color:rgb(44 , 137 , 255);
}
/*按钮按下态*/
QPushButton:pressed
{
    /*背景颜色*/
    background-color:rgb(14 , 135 , 228);
    /*左内边距为3像素,让按下时字向右移动3像素*/
    padding-left:3px;
    /*上内边距为3像素,让按下时字向下移动3像素*/
    padding-top:3px;
}
上面例子是实现按钮三态效果的样式表。
注:程序设置的样式表比ui文件里设置的优先级更高。
二、样式表语法
2.1 样式规则
QSS包含了一个样式规则,一个样式规则由一个选择器和声明组成,选择器指定哪些部件由规则影响,声明指定哪些属性应该在部件上进行设置。例如:
QPushButton { color: red }
上面的例子中QPushButton是选择器,{ color: red }是声明,该规则指定QPushButton及其子类(例如:MyPushButton)应使用红色作为前景色。
几个选择器可以指定相同的声明,使用逗号(,)来分隔选择器。例如:
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通常不区分大小写(即:color、Color、COLOR、cOloR指同一属性),唯一例外就是类名(class names)、对象名(object names)、属性名(property names)区分大小写。
2.2 选择器类型
下表总结了最有用的选择器,所有示例使用了选择器中最简单的类型,类型选择器QSS支持所有的selectors defined in CSS2。
| 选择器 | 示例 | 说明 | 
|---|---|---|
| 通用选择器 | * | 匹配所有部件 | 
| 类型选择器 | QPushButton | 匹配QPushButton及其子类的实例 | 
| 属性选择器 | QPushButton[flat=”false”] | 匹配QPushButton中flat属性为false的实例。 | 
| 类选择器 | .QPushButton | 匹配QPushButton的实例,但不包含子类。相当于*[class~=”QPushButton”]。 | 
| ID选择器 | QPushButton#okButton | 匹配所有objectName为okButton的QPushButton实例。 | 
| 后代选择器 | QDialog QPushButton | 匹配属于QDialog后代(孩子,孙子等)的QPushButton所有实例。 | 
| 子选择器 | QDialog > QPushButton | 匹配属于QDialog直接子类的QPushButton所有实例。 | 
2.3 子控件
对于样式复杂的部件,需要访问子控件,例如:QComboBox的下拉按钮或QSpinBox的上下箭头。选择器可能包含子控件,使得可以限制特有部件子控件的应用规则。例如:
QComboBox::drop-down { image: url(dropdown.png) }
上述规则指定了QComboBoxe下拉按钮样式,虽然双冒号(::)语法让人想起CSS3伪元素,但Qt子控件从概念上讲有不同的级联语义。
子控件定位总是相对于另一个参考元素,这个参考元素可能是小部件或其它子控件。例如:QComboBox的::drop-down放置,默认的放置在QComboBox区域的右上角。而::drop-down放置,默认的在::drop-down子控件的中央。
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):允许子控件改变位置和的大小而不受参考元素限制。
参考助手:Qt Style Sheets Reference中List of Sub-Controls部分,及Qt Style Sheets Examples中Customizing the QPushButton's Menu Indicator Sub-Control部分。
2.4 伪选择器
选择器可以包含伪状态,意味着限制基于部件状态的应用程序规则。伪状态出现在选择器后面,用冒号(:)关联。例如,鼠标划过按钮:
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部分。
2.5 解决冲突
示例一
当样式中指定相同的属性具有不同的值时,就会出现冲突。例如:
QPushButton#okButton { color: blue }
QPushButton { color: red }
要解决这个冲突,必须考虑到的选择器的特殊性。上面的例子,QPushButton#okButton 被认为比 QPushButton 更具体,因为它通常是指单个对象,而不是一类的所有实例。所以 okButton 这个按钮文本颜色会设置为blue,而其它按钮文本仍然设置为red。
示例二
同样的,利用伪状态比不指定伪状态那些选择器更具体。因此,下面的样式指定一个QPushButton应该有鼠标悬停文本颜色为白色,否则文本颜色为红色。
QPushButton:hover { color: white }
QPushButton { color: red }
示例三
QPushButton:hover { color: white }
QPushButton:enabled { color: red }
这里,两个选择器有相同的特殊性,但后一条规则优先,即QPushButton:enabled { color: red }优先级更高,所以按钮默认 enabled 的情况下,无论鼠标是否悬停在按钮上,文本颜色始终为白色。
QPushButton:enabled { color: red }
QPushButton:hover { color: white }
想要鼠标是否悬停在按钮上文本颜色为白色,根据后面规则优先级更高的原则,则使颜色为white的规则在后面即可,如上所示。
或者,可以使文本颜色为白色的规则更加具体:
QPushButton:hover:enabled { color: white }
QPushButton:enabled { color: red }
示例四
类似的问题出现在类型选择器一起使用。请看下面的例子:
QPushButton { color: red }
QAbstractButton { color: blue }
两个规则应用于 QPushButton 实例(因为 QPushButton 继承自 QAbstractButton)并有color属性的冲突。因为 QPushButton 继承 QAbstractButton,所以 QPushButton 比 QAbstractButton 更具体,本应该按钮文本颜色为红色。然而,对于QSS的计算,所有的类型选择具有相同的特殊性,最后出现的规则优先,所以实际上按钮文本颜色为蓝色。如果需要设置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.color    {}  /* a=0 b=1 c=3 -> specificity =  13 */
LI.color.width    {}  /* a=0 b=2 c=1 -> specificity =  21 */
#okButton         {}  /* a=1 b=0 c=0 -> specificity = 100 */
2.6 级联效应
QSS可以在QApplication、父部件、子部件中设置。冲突发生时,不论冲突规则的特殊性,部件自身的样式表总优先于任何继承样式表。考虑下面的例子。首先,我们在QApplication中设置样式表:
qApp->setStyleSheet("QPushButton { color: white }");
然后,我们设置QPushButton的样式表:
myPushButton->setStyleSheet("color: blue");
QPushButton样式表强制QPushButton(以及任何子部件)显示蓝色文字,尽管应用程序范围内的样式表提供的规则更具体。
2.7 继承性
在经典的CSS中,当字体和颜色没有明确设置时,它就会自动从父继承。当使用QSS时,部件不会自动从父继承字体和颜色。例如,一个QGroupBox中包含QPushButton:
qApp->setStyleSheet("QGroupBox { color: red; } ");
QPushButton不会继承其父QGroupBox的颜色,而是显示系统的颜色。
三、CSS常用样式
3.1 CSS文字属性
| CSS文字属性及示例 | 说明 | 
|---|---|
| color:#999999; | 文字颜色 | 
| font-family:Microsoft Yahei,sans-serif; | 字体家族 | 
| font-size:16pt; | 字体大小 | 
| font-style:itelic;(normal、oblique) | 字体样式 | 
| letter-spacing:1pt; | 字间距离 | 
| line-height:200%; | 设置行高 | 
| font-weight:bold;(lighter、normal、数值900) | 字体粗细 | 
| text-decoration:underline;(line-through、overline、none) | 字体修饰 | 
| text-align:left;(right、center、justify) | 文字左对齐 | 
| vertical-align:top;(bottom、middle、text-top、text-bottom) | 垂直对齐方式 | 
| text-transform:uppercase;(lowercase、capitalize) | 英文大写 | 
| font-variant: small-caps;(normal) | 小型大写字母 | 
3.2 CSS背景样式:
| CSS背景样式及示例 | 说明 | 
|---|---|
| background:black; | 背景颜色为黑色 | 
| background-color:#F5E2EC; | 背景颜色 | 
| background-image:url(/image/bg.gif); | 背景图片 | 
| background:transparent; | 透视背景 | 
| background-repeat : repeat; | 重复排列-网页默认 | 
| background-position : center; | 指定背景位置-居中对齐 | 
3.3 CSS边框空白
| CSS边框空白及示例 | 说明 | 
|---|---|
| padding:5px 10px 5px 10px; | 所有边框留空白 | 
| padding-top:10px; | 上边框留空白 | 
| padding-right:10px; | 右边框留空白 | 
| padding-bottom:10px; | 下边框留空白 | 
| padding-left:10px; | 左边框留空白 | 
3.4 CSS框线
| CSS框线建议书写方式 | 说明 | 
|---|---|
| border:1px solid red; | 所有边框线 | 
| border-top:1px solid #6699cc; | 上框线 | 
| border-bottom:1px solid #6699cc; | 下框线 | 
| border-left:1px solid #6699cc; | 左框线 | 
| border-right:1px solid #6699cc; | 右框线 | 
| border-radius:8px; | 边框圆角半径 | 
以上是建议书写方式,但也可以使用常规书写方式,如下表所示:
| CSS框线常规书写方式 | 说明 | 
|---|---|
| border-top-color:#369; | 设置上框线颜色 | 
| border-top-width:1px; | 设置上框线宽度 | 
| border-top-style:solid | 设置上框线样式 | 
其他框线样式如下:
- solid - 实线
 - dotted - 虚线
 - double - 双线
 - inset - 凹框
 - outset - 凸框
 - groove - 立体内凸框
 - ridge - 立体浮雕框
 
3.5 CSS边界样式
| CSS边界样式及示例 | 说明 | 
|---|---|
| margin-top:10px; | 上边界值 | 
| margin-right:10px; | 右边界值 | 
| margin-bottom:10px; | 下边界值 | 
| margin-left:10px; | 左边界值 | 
注:px:相对长度单位,像素(Pixel)。pt:绝对长度单位,点(Point)。
参考:
Qt样式表之二:QSS语法及常用样式的更多相关文章
- CSS 四种样式表 六种规则选择器 五种常用样式属性
		
新的html程序要在VS中编写了,在vs中安装ASP.NET和Web开发,并用ASP.NET Web 应用程序(.NETFramework)创建一个网页程序.添加一个html页 后面的代码都是在htm ...
 - CSS 样式表{二}
		
1 选择器的优先级 选择器的优先主要考虑选择器的权重 可以将各种选择器的权重以数值来表示,数值越大,优先级越高 选择器 权重值 标签selector 1 类选择器 10 ID选择器 100 行内样式 ...
 - CSS样式表(二)
		
[layout] clear:该属性的值指出了不允许有浮动对象的边. 默认值:none none: 允许两边都可以有浮动对象 both: 不允许有浮动对象 left: 不允许左边有浮动对象 right ...
 - Qt 之 QSS(样式表语法)
		
https://blog.csdn.net/liang19890820/article/details/51691212 简述 Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同.如果你熟悉 ...
 - Qt之QSS(样式表语法)
		
http://blog.csdn.net/liang19890820/article/details/51691212 版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者: ...
 - QT样式表
		
QT样式表 一.QT样式表简介 1.QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离,使得设计皮肤与界面控件分离的软件成为可能. QT样式表是允许用户定制widgets组件外观的强大机制 ...
 - 【转】QT样式表 (QStyleSheet)
		
作者:刘旭晖 Raymond 转载请注明出处Email:colorant@163.comBLOG:http://blog.csdn.net/colorant/ 除了子类化Style类,使用QT样式表( ...
 - QT +样式表
		
学习样式表的目的:可以设计出好看的控件.(比如可以给一些按钮设计成好看的图片) QT 样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS),通过调用QWidget->setStyleS ...
 - Qt——浅谈样式表
		
优秀的程序,不仅要有严密逻辑,而且应该有美观的外表.从软件界面,便可看出你是否用心在做,是否是一个有思想的人. Qt样式表的术语和语法规则和HTML CSS有很多相似之处. 样式规则 Qt中样式规则由 ...
 
随机推荐
- Java核心技术之基本数据类型
			
这篇文章.我们讨论一些java的最主要的东西.这些东西我们一般刚刚学java的时候就学过,可是不一定真正明确. 正好,我在做一个读取内存的值,涉及到bit位的值的读取和写.那就能够讨论一个java的基 ...
 - WPF新手之如何将数据绑定到TreeView
			
看过许多例子,全是绑定到类的,没人说如何绑定到某个对象,偏偏我这个绝对的新手就是要绑定到一个对象,只能自己摸索了: 首先要将数据绑定到容器,有以下几个默认条件:①元数据必须包装在List或者Obser ...
 - Python 006- python socket编程详细介绍
			
转自https://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供 ...
 - MRUnit测试
			
新建一个专门的测试类,代码如下: wordcount的map函数输入string line, 输出<单词 , 1> 右键-> run as junit 出错了,因为输出不是 ...
 - Linux 常用命令 (备忘)
			
查看linux版本信息 uname -r cat /proc/version
 - Struts2的运行流程及其工作原理
			
1 服务开启,配置文件初始化 2 用户访问login请求 3 进入web.xml文件中我们配置的核心控制器(filter) 4 核心过滤器中有一个FilterDispatcher,FilterDisp ...
 - Deep Learning 33:读论文“Densely Connected Convolutional Networks”-------DenseNet 简单理解
			
一.读前说明 1.论文"Densely Connected Convolutional Networks"是现在为止效果最好的CNN架构,比Resnet还好,有必要学习一下它为什么 ...
 - 使用Mock.js进行独立于后端的前端开发
			
Mockjs能做什么? 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. 能解决的问题 开发时,前后端进度不同步,后端还没完成数据输出,前端只好写静态模 ...
 - 成本函数计算方法J
			
J = 1/(2*m) * sum((X*theta - y).^2); OR
 - spring mvc带参数重定向
			
http://blog.csdn.net/jackpk/article/details/19121777/ https://isudox.com/2017/02/16/spring-mvc-redir ...