赞
踩
QSS(Qt Style Sheets)即 Qt 样式表,是用来定义控件外观的一种机制。QSS 大量参考了 CSS 的内容,和 CSS 的使用相类似,但功能要比 CSS 弱的多。主要体现为选择器少,可用的属性也少,并且不是所有的属性都可以应用在 PyQt 的控件上。但是 QSS 可以使页面和美化代码分开,利用维护,也给我们提供了页面美化的方案。
QSS 的语法规则几乎与 CSS 相同,如果对 CSS 比较了解的话,那么 QSS 的使用就不会有什么问题。
QSS 样式由两部分组成,其中一部分是选择器,指定哪些控件会受到影响;另一部分是声明,指定哪些属性应该在控件上进行设置。声明部分是一系列的“属性:值”对,使用英文分号(;)分隔各个不同的属性对,使用大括号({})将所有的声明包括在内。
示例:
- QPushButton {
- color: red
- }
熟悉 CSS 的看到这样的表示方式应该不陌生,表示将 QPushButton 的前景色设置为红色。从 CSS 来看,这样理解没有什么问题,但是 QSS 这里是不一样的,QPushButton 表示的是PyQt中的按钮类,而非 CSS 中的标签含义,既然含义不一样了,那么上面的样式也多少会有区别。它代表的意义是:QPushButton 类及其子类的所有实例的前景色是红色。需要注意的是,凡是继承 QPushButton 的子类都会受到影响。
QSS选择器有如下几种类型:
以上所有的选择器可以联合使用,并且支持一次设置多种类型选择器,用英文逗号隔开,这与 CSS 的使用基本上是一样的。
上面完成了对QSS常用内容的说明,接下来看一下如何在代码中设置QSS。使用的方式也很简单,调用 QWidget 的成员函数 setStyleSheet(QSS格式字符串) 即可完成设置。
代码示例:
- import typing
- from PyQt5 import QtCore
- from PyQt5.QtWidgets import *
- import sys
-
- from PyQt5.QtWidgets import QWidget
-
- # 使用代码方式设计页面,以便代码演示
- class QssDemo(QWidget):
- def __init__(self):
- super().__init__()
-
- # 创建 QPushButton 实例
- btn = QPushButton(self)
- # 设置按钮显示文字
- btn.setText("QSS展示按钮")
- # 设置 objectName 为 btn
- btn.setObjectName("btn")
-
- self.setWindowTitle("QSS样式使用示例")
-
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- win = QssDemo()
-
- # QSS样式字符串
- qssStr = """
- #btn {
- width: 200;
- height: 100;
- color: red;
- }
- """
- win.setStyleSheet(qssStr)
-
- win.show()
- sys.exit(app.exec_())
以上的代码示例应该不难理解,不过这个代码有些问题,问题是我们把QSS的样式以编码的方式写在了代码中,不方便以后的维护。
发现问题,解决问题。可以将QSS样式内容编写进以后缀名 .qss 命名的文件,然后再在程序中读取加载该文件内容就可以完成代码和QSS样式相分离的目的。
对上面示例代码进行改造。新建 test.qss 样式文件,将上面示例代码中的 QSS 内容放入该文件中。
- #btn {
- width: 200;
- height: 100;
- color: red;
- }
接下来将上面示例代码入口处设置QSS样式的方式改为从QSS文件加载。此处仅展示不一样的代码部分。
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- win = QssDemo()
-
- # 加载 QSS 样式文件 test.qss
- with open("test.qss", "r") as f:
- qssStr = f.read()
- win.setStyleSheet(qssStr)
-
- win.show()
- sys.exit(app.exec_())
这里只是对QSS做了一个简短的介绍,具体内容可以查看官方文档:Qt Style Sheets — Qt for Python。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。