概述
Qt Style Sheet(简称QSS)十分强大,允许自定义控件的外观,QSS的语法重度参考了CSS的语法规则,但非完全一致。
对于QSS的设置,有两个函数
QApplication::setStyleSheet() //作用范围为整个应用程序
QWidget::setStyleSheet() //作用范围是特定控件(含子控件)
QSS是针对Qt Widgets体系的,只能在该体系下使用,不能用于Qt Quick
样式规则
QSS由一系列样式规则组成,样式规则由选择器和声明组成,其中样式指定哪些小组件受规则影响,声明指定应在小组件上设置哪些属性,如:
QPushButton{color: red} //QPushButton是选择器,{color:red}是声明
QSS语法不分大小写,除了类名,对象名,属性名外,多个选择器可以使用相同声明,通过逗号分隔选择器,有多条声明要用分号分隔,如:
QPushButton,QLineEdit{ color:red;background-color:white}
选择器类型
选择器 | 示例 | 说明 |
---|---|---|
通用选择器 | * | 匹配所有部件 |
类型选择器 | QPushButton | 匹配QPushButton及其子类的实例 |
属性选择器 | QPushButton[flat = “false”] | 匹配QPushButton中flat属性为false的实例 |
类选择器 | .QPushButton | 匹配QPushButton的实例,但不包含子类 |
id选择器 | QPushButton#okbtn | 匹配所有对象名为okbtn的实例 |
后代选择器 | QDialog QPushButton | 匹配属于QDialog后代的QPushButton所有实例 |
子选择器 | QDialog > QPushButton | 匹配属于QDialog直接子类的QPushButton所有实例 |
子控件
对于样式复杂的部件,需要访问子控件,比如QComboBox的下拉按钮,选择器可能包含子控件,我们可以指定这些选择器的子控件样式。如:
QComboBox::down-arrow {
image: url(down_arrow.png);
}
QComboBox::down-arrow:pressed {
position: relative;
top: 1px; left: 1px;
}
这段代码指定了QComboBox的下拉按钮样式
伪选择器
QSS的伪状态:限制控件只能在某种状态下被样式表作用。比如鼠标按下是一种样式,鼠标悬浮在控件上是一种样式,等等。
伪状态出现在选择器后面,用冒号关联,如:
QPushButton:hover{color:red}
伪状态可以用感叹号表示否定,如:
QPushButton:!hover{color:red}
伪状态可以连接使用,如:
QPushButton:hover:pressed{color:red}
否定的伪状态可以连接使用,如:
QPushButton:hover:!pressed{color:red}
可以使用逗号操作来表示逻辑或,如:
QPushButton:hover,pressed{color:red}
伪状态可以与子控件组合,如:
QComboBox::drop-down:hover{image:url(picture.png)}
冲突
当样式中指定相同属性有不同值时,会出现冲突, 如:
QPushButton#okbtn{color:red}
QPushButton{color:blue}
因为#okbtn更具体,是指单个对象,而不是一类的所有实例了,所以#okbtn这个按钮会被设置为红色,而其他会被设置为蓝色
同样,伪状态比不指定伪状态的选择器更具体。
两个选择器有相同的特殊性时,后一条规则优先。
级联效应
冲突发生时,不论冲突规则的特殊性,部件自身的样式表总是优先于任何继承样式表
继承性
部件不会自动从父继承字体和颜色,例如,一个QGroupBox中包含QPushButton,QGroupBox设置颜色样式后,QPushButton不会继承其父QGroupBox的颜色,而是显示系统的颜色。
参考博客