QSS即Qt StyleSheet(Qt样式表)的简称,是一种用来自定义控件外观的强大机制,QSS可以让我们的程序界面更加漂亮
每条QSS样式都由两部分组成:1. 选择器,该部分指定要美化的控件 2. 声明,该部分指定要在控件上使用的属性
1 import sys 2 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, \ 3 QComboBox, QStackedWidget, QGroupBox, QVBoxLayout 4 5 class Demo(QWidget): 6 def __init__(self): 7 super(Demo, self).__init__() 8 self.button1 = QPushButton('button1', self) 9 self.button2 = QPushButton('button2', self) 10 self.button2.setProperty('name', 'btn') #给控件添加一个属性 11 #属性名:name 12 #属性值:'btn' 13 14 self.lineedit1 = QLineEdit(self) 15 self.lineedit1.setPlaceholderText('direct') 16 self.lineedit2 = SubLineEdit() 17 18 my_list = ['A', 'B', 'C', 'D'] 19 self.combo = QComboBox(self) 20 self.combo.addItems(my_list) 21 self.combo.setObjectName('cb') #将控件的objectName设置为cb 22 23 self.gb = QGroupBox() 24 self.label1 = QLabel('label1') 25 self.label2 = QLabel('label2') 26 self.stack = QStackedWidget() 27 self.stack.addWidget(self.label2) 28 29 self.gb_layout = QVBoxLayout() 30 self.gb_layout.addWidget(self.label1) #分组框gb直接包含label1 31 self.gb_layout.addWidget(self.stack) #分组框gb间接包含label2 32 self.gb.setLayout(self.gb_layout) 33 34 self.v_layout = QVBoxLayout() 35 self.v_layout.addWidget(self.button1) 36 self.v_layout.addWidget(self.button2) 37 self.v_layout.addWidget(self.lineedit1) 38 self.v_layout.addWidget(self.lineedit2) 39 self.v_layout.addWidget(self.combo) 40 self.v_layout.addWidget(self.gb) 41 self.setLayout(self.v_layout) 42 43 class SubLineEdit(QLineEdit): 44 def __init__(self): 45 super(SubLineEdit, self).__init__() 46 self.setPlaceholderText('indirect') 47 48 if __name__ == '__main__': 49 app = QApplication(sys.argv) 50 demo = Demo() 51 qss = ''' 52 * {color: red} 53 QPushButton {background-color: blue} 54 QPushButton[name='btn'] {background-color: green} 55 .QLineEdit {font: bold 20px} 56 QComboBox#cb {color: blue} 57 QGroupBox QLabel {color: blue} 58 QGroupBox > QLabel {font: 30px} 59 '''
#定义样式
60 demo.setStyleSheet(qss) #给demo对象设置样式 61 demo.show() 62 sys.exit(app.exec_())
选择器:
* 匹配所有控件
QPushButton 匹配所有QPushButton实例及其子类
QPushButton[name='btn'] 匹配所有name属性为btn的QPushButton实例
QPushButton[name~='btn'] ~=匹配所有name属性中包含btn的QPushButton实例
.QPushButton 匹配所有QPushButton实例,但不匹配其子类。等同于*[class~="QPushButton"]
QComboBox#cb 匹配所有objectName为cb的QComboBox实例
QGroupBox QLabel {color: blue} 把所有包含在QGroupBox中的QLabel控件的文本颜色设为蓝色(无论直接包含还是间接包含)
QGroupBox > QLabel {font: 30px} 把所有QGroupBox直接包含的QLabel文本字体大小设为30px
有些小伙伴可能就问了:* {color: red} 明明这条样式是让所有的文本颜色变为红色,但是有些控件的文本并没有根据这条来,为什么?
这里就涉及到一个“具体与笼统”的概念,当选择器写的越具体,选择器的优先程度越高。通配符*这一选择器写法非常笼统,而之后几条样式的选择器都是指定了控件名称的,比通配符更加具体,所以优先度更高
属性:
color: red 前景色
background-color: green 背景色
font: bold 20px 字体
qss = 'QPushButton {color: red}' 单选择器单属性
qss ='QPushButton {color: red; background-color: blue}' 单选择器多属性
qss = 'QPushButton, QLabel, QLineEdit {color: red}' 多选择器
子控件
了解下什么是子控件:我们知道QComboBox由一个矩形框和一个下拉按钮组成,而这个下拉按钮就是QComboBox的子控件了,PyQt5允许我们使用QSS对其进行样式化