不二如是 发表于 2016-10-31 16:43:53

139-#重磅-Qt样式表(StyleSheet)

本帖最后由 不二如是 于 2016-11-2 15:07 编辑



Qt中的样式表是一个可以自定义部件外观的强大机制!!!

Qt样式表其实原型就是受到HTML的层叠样式表(Cascading Style Sheets,CSS)的启发!

不过与CSS不同的是,Qt样式表应用于部件的天地,而不是网页~


[*]使用

其实就两种,也只能两种{:10_266:}

[*]设计模式-样式表修改
[*]代码模式-QApplication::setStyleSheet()函数设置



[*]语法介绍

Qt的StyleSheet(以下简称:QSS)术语和语法规则与HTML CSS基本相同~

熟悉后面这两个的鱼油,基本上可以无缝上手~

不二从下面几个方面,给你好好剖析重温下

[*]样式规则

样式表包含了很多规则,一个样式表必须要由以下两部分构成:

选择符(selector) + 声明(declaration)

选择符指定了受该规则影响的部件,指定了这个部件上要设置的属性:

QPushButton{color:Cyan}

在这个规则中,QPushButton是选择符,{color:Cyan}是声明,color是属性,Cyan是值。

这个规矩指定了QPushButton和他的子类应该使用cyan作为前景色。

多个选择符实现相同功能,可以用逗号隔开,如:

QLabel、QPushButton、QComoBox{color:cyan}

一个样式表规则的声明部分是一些属性:值对组成的列表,包含在大括号({ })中,用分号(;)隔开。

QPushButton{color:cyan ; background-color:green}



有兴趣的可以去Qt Style Sheets Reference->List of Properties

看支持的所有属性,就是上面的gif~


[*]选择符类型

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

下面这张表里的内容是网友们总结的,很经典!


选择符 示例 说明
通用选择符 * 匹配所有部件
类型选择符 QPushButton 匹配所有QPushButton实例和它的所有子类
属性选择符 QPushButton 匹配QPushButton的属性flat为false实例
类选择符 .QPushButton 匹配所有QPushButton实例但不包含它的子类
ID选择符 QPushButton#okButton 匹配所有QPushButton中以okButton为对象名的实例
后代选择符 QDialog QPushButton 匹配所有QPushButton实例,必须是QDialog的子孙部件
孩子选择符 QDialog>QPushButton 匹配所有QPushButton实例,必须是QDialog的直接子部件



[*]子控件

一些复杂的部件修改QSS可能需要访问自己的子控件(Sub-Controls)

例如,QComboBox的下拉按钮,QSpinBox的上下箭头等

选择符可以包含子控件来对部件的特定子控件应用规则,如:

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

这句话可以改变所有QComboBox部件的下拉按钮的样式。



有兴趣的可以去Qt Style Sheets Reference->List of Stylable Widgets

列出所有使用QSS来自定义样的Qt部件,就是上面的gif~



有兴趣的可以去Qt Style Sheets Reference->List of Sub-Controls

列出所有可用的子控件,就是上面的png~

[*]伪状态

选择符可以包含伪状态(Pseudo-States)来限制规则在部件的指定的状态上应用。

伪状态出现在选择符后,用冒号(:)隔离,如:

QPushButton:hover{color:cyan}

该句表明,当鼠标悬停(hover)停在一个QPushButton部件上时才应用规则。

伪状态也可以使用感叹号(!)来表示否定哈,如:

QPushButton:!hover{color:cyan}

该句表明,当鼠标没有悬停在QPushButton上才应用规则。

伪状态也可以多个连用,如:

QCheckBox:hover:checked{color:cyan}

该句表明,当鼠标悬停在一个被选中的QCheckBox部件上时才应用规则。

如有需要,也可以使用逗号(,)来表示逻辑‘或’,如:

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

该句表明,当鼠标悬停或者被选中的QCheckBox部件上时才应用规则。



有兴趣的可以去Qt Style Sheets Reference->List of Pseudo-States

列出所有可用的自控件,就是上面的png~

[*]冲突解决

当几个QSS规则对相同的属性指定了不同的值时就会发生冲突啦~

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

这样okButton的color属性就有了两个不同的值->冲突!

解决这个冲突的原则:

特殊的选择符有限

因为QPushButton#okButton一般代表一个单一的对象,而不是全局那样所有类的实例。

所以,他比QPushButton更特殊~

那么就会优先使用第一个规则->okButton的文本颜色为cyan哈~

相似的,有伪状态比非伪状态优先。

如果两个选择符的特殊性相同,那么怎么办?

很简单,最后出现的比前面那个优先,就是哪个行数大听谁的。


[*]层叠

QSS可以设置在QApplication或者父部件或者子部件上。

部件有效的QSS通过部件祖先的QSS和QApplication上的QSS合并得到。

当发生冲突,部件自己的QSS优先于任何继承的QSS,听自己的~

同样,父部件的QSS优先于祖先的QSS~



[*]自定义部件外观

[*]盒子模型



当使用QSS,每一个部件都拥有盒子模型(The Box Model)就是4个同心矩形的盒子,给你放大下:



从内往外分别是:

CONTENT(内容)、PADDING(填衬)、BORDER(边框)、MARGIN(边距)

除了内容外,其他默认值都是0~

可以使用background-image属性为部件(之前用过很多次了)制定一个背景。

默认,background-image只有在边框以内(里三层)进行绘制。

可以通过background-clip属性进行更改~

background-repeat->控制背景图片的重复方式

background-origin ->控制背景图片的原点所在

任何一个background-image无法随着部件的大小自动缩放!

想要的话,必须使用border-image()124,☜点我带你重温下那激情的一刻(^ω^) ~

border-image 优先级低于 background-image,两个同时出现,前者绘制后着之上~


[*]换肤

QSS可以存放在一个以.qss为后缀的文件中。

这样就可以在程序中调用不同的.qss文件来实现换肤功能~

前面玩儿过几次了,很简单~





miss陈 发表于 2017-2-10 12:22:20

个人愚见,应以示例源码作为教学基础。如果有的话。
感谢并支持不二如是先生。
页: [1]
查看完整版本: 139-#重磅-Qt样式表(StyleSheet)