QSS 样式设定
QSS 是 PyQt5 里用来设定元件样式的样式表 ( Qt Style Sheet ),使用方法和网页 CSS 非常类似,虽然 QSS 没有办法像网页 CSS 般的完整,但已经可以满足大部分的样式设计需求,这篇教学会介绍如何使用 QSS 设定元件样式。
快速导览:
- PyQt6 版本参考:PyQt6 教学 - QSS ( Qt Style Sheet ) 样式设定
- 因为 Google Colab 不支援 PyQt5,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
开始使用 QSS
在 PyQt5 里建立元件之后,元件会具有一个 setStyleSheet() 方法,在方法里撰写样式,就会修改原本元件的样式,例如下方的程序码执行后,就会将 QLabel 的文字设定为 30px 的大小和红色 ( 如果遇到多个样式,可以使用三个单引号的方式撰写 )。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(10,10,150,100)
label.setText('HELLO')
label.setStyleSheet('''
font-size:30px;
color:red;
''')
Form.show()
sys.exit(app.exec_())
常用样式设定
下方列出一些常用的样式 ( 完整属性参考“List of Properties”)。
| 样式 | 说明 |
|---|---|
| font-size | 文字大小,单位 px。 |
| color | 文字颜色,可使用颜色名称或色码,例如 #f00 为红色。 |
| font-family | 字体。 |
| font-weight | 字体粗细,可设定 normal、bold。 |
| font-style | 文字样式,可设定 normal、italic、oblique。 |
| spacing | 文字间距,不用单位。 |
| text-align | 文字对齐方式,可设定 left、center、right。 |
| height | 元件高度,单位 px。 |
| width | 元件宽度,单位 px。 |
| margin | 元件外边距,单位 px。 |
| padding | 元件内边距,单位 px。 |
| opacity | 透明度,范围 0~255,0 为透明。 |
| background | 背景色或背景图,可使用颜色名称或色码,例如 #f00 为红色。 |
| background-color | 背景色,可使用颜色名称或色码,例如 #f00 为红色。 |
| border | 边框,有三个值分别是 ( 粗细、样式、颜色 )。 |
| border-width | 边框宽度,单位 px。 |
| border-style | 边框样式,可设定 solid、dashed、dotted。 |
| border-color | 边框颜色,可使用颜色名称或色码,例如 #f00 为红色。 |
| border-radius | 边框是否圆角,圆角半径单位 px。 |
样式里的 padding、margin、border-width、border-style、border-color 的简单设定规则如下 ( 以 padding 为例 ):
| 写法 | 说明 |
|---|---|
| padding:1px | 上下左右都 1px。 |
| padding:1px 2px | 上下 1px,左右 2px。 |
| padding:1px 2px 3px | 上 1px,左右 2px,下 3px。 |
| padding:1px 2px 3px 4px | 上 1px,右 2px,下 3px,左 4px。 |
如果不要一次设定 padding、margin、border、border-width、border-style、border-color,也可以加上方向的名称单独设定 ( 以 padding 为例 ):
| 样式 | 说明 |
|---|---|
| padding-top | 元件上方内边距,单位 px。 |
| padding-right | 元件右侧内边距,单位 px。 |
| padding-bottom | 元件下方内边距,单位 px。 |
| padding-left | 元件左侧内边距,单位 px。 |
伪状态设定
除了设定主要样式,QSS 也像 CSS 一样可以设定“伪状态”( Pseudo-States ),伪类的意思是“触发了某些事件或进行某些行为后,才会出现的状态” ( 伪类会使用一个冒号开头 ),例如“鼠标移到按钮上”的行为,对应的伪状态就是“:hover”,下方列出一些常见的伪状态 ( 完整伪状态参考“List of Pseudo-States” ):
| 伪状态 | 说明 |
|---|---|
| :hover | 鼠标移上去。 |
| :active | 发生行为 ( 通常可能是点击 )。 |
| :focus | 成为焦点 ( 通常是点击之后 )。 |
| :checked | 被勾选。 |
| :disabled | 停用状态。 |
| :enabled | 启用状态。 |
| :selected | 被选取。 |
以下方的程序码为例,执行后会设定 QPushButton 的 :hover 样式 ( 注意需要额外使用 QPushButton:hover ),当鼠标移动到按钮上方时,按钮的边框会变粗,背景色会变成黄色。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
btn = QtWidgets.QPushButton(Form)
btn.setGeometry(10,10,150,100)
btn.setText('HELLO')
btn.setStyleSheet('''
QPushButton{
border:1px solid #000;
background:#fff;
}
QPushButton:hover{
border:5px solid #000;
background:#ff0;
}
''')
Form.show()
sys.exit(app.exec_())
子控件设定
在 PyQt5 里,有些元件可能会包含其他的子控件 ( 例如 QListWidget 列表选择框会包含选项的子元件 ),这些子元件也可以使用对应的 QSS 语法设定样式 ( 子控件会使用两个冒号开头 ),下方列出一些常见的子元件设定方法 ( 完整子元件设定参考“List of Sub-Controls” ):
| 子控件 | 说明 |
|---|---|
| ::chunk | 进度条进度。 |
| ::item | 列表选择框项目。 |
| ::groove | 滑杆底线。 |
| ::handle | 滑杆拉霸。 |
| ::sub-page | 滑杆调整线。 |
下方的程序码执行后,会将 QSlider 数值调整滑杆更改为黑底线与红色调整杆。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
slider = QtWidgets.QSlider(Form)
slider.setGeometry(20,20,200,30)
slider.setOrientation(1)
slider.setStyleSheet('''
QSlider {
border-radius: 10px;
}
QSlider::groove:horizontal {
height: 5px;
background: #000;
}
QSlider::handle:horizontal{
background: #f00;
width: 16px;
height: 16px;
margin:-6px 0;
border-radius:8px;
}
QSlider::sub-page:horizontal{
background:#f90;
}
''')
Form.show()
sys.exit(app.exec_())
注意事项
虽然使用 QSS 可以很方便的修改样式,但仍然有些小细节需要注意,例如 QPushButton,一旦设定了“边框”,则必须要一并设定背景色和点击样式,不然其他样式就会被清空,类似这种状况可以参考“Qt Style Sheets Reference”里有特别标注“粉红色背景”的说明。
下方的程序码执行后,会发现本来按钮的点击效果,因为设定了 border 样式而消失了。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
btn = QtWidgets.QPushButton(Form)
btn.setGeometry(10,10,150,100)
btn.setText('HELLO')
btn.setStyleSheet('border:1px solid #000')
Form.show()
sys.exit(app.exec_())
参考数据
完整 QSS 说明可以参考:Qt Style Sheets Reference
微信扫码关注
抖音扫码关注