前言
通过Qt实例、实例名称、实例属性为控件设置样式。QObject是Qt框架中的核心类之一,它提供了强大的对象模型功能。通过名称和属性的操作,可以更灵活地管理Qt对象,实现更复杂的应用逻辑。
1.1 API
QObject的API包括QObject对象的名称和属性的操作。
QObject对象名称操作
NO | 方法 | 描述 |
---|---|---|
1 | setObjectName() | 设置QObject对象的名称 |
2 | objectName() | 要获取QObject对象的名称 |
QObject对象属性操作
NO | 方法 | 描述 |
---|---|---|
1 | setProperty() | 设置动态属性 |
2 | property() | 获取动态属性 |
3 | dynamicPropertyNames() | 获取通过setProperty()设置的全部属性名称 |
1.1.1 setObjectName
用法
setObjectName(self, name: str)
描述
调用setObjectName(‘唯一名称’),为Qt对象设置一个名称,这个名称通常是唯一的,当作对象的ID使用。
1.1.2 objectName
用法
objectName(self) -> str
描述
调用objectName(),获取Qt对象的名称。
1.1.3 setProperty
用法
setProperty(self, name: str, value: Any) -> bool
描述
调用setProperty(‘属性名称’,值),为Qt对象动态设置属性和值。
1.1.4 property
用法
property(self, name: str) -> Any
描述
调用property(‘属性名称’),获取Qt对象的属性值。
1.1.5 dynamicPropertyNames
用法
dynamicPropertyNames(self) -> List[QByteArray]
描述
调用dynamicPropertyNames(),获取Qt对象中通过setProperty()设置的全部属性名称。
1.1.6 示例
代码如下:
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('学习QObject-梯阅线条')
self.resize(500, 300)
self.move(900, 300)
self.set_ui()
def set_ui(self):
self.test_objnames_properties()
@staticmethod
def test_objnames_properties():
obj = QObject()
obj.setObjectName('notice')
print(obj.objectName())
obj.setProperty('notice_level_1', 'error')
obj.setProperty('notice_level_2', 'warn')
print(obj.property('notice_level_1'))
print(obj.dynamicPropertyNames())
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
执行结果如下:
1.2 应用场景
通过Qt实例、实例名称、实例属性为控件设置样式。
1.2.1 设置样式
用法
setStyleSheet(self, styleSheet: str)
描述
调用setStyleSheet(),设置Qt控件的外观,比如字体大小、背景颜色、文本颜色,边框样式等。
self:指的是调用这个方法的对象实例,比如一个按钮、文本框或者是整个应用程序的主窗口。
styleSheet:一个字符串,包含了用于定义控件外观的CSS样式规则。
示例
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('学习QObjecct-梯阅线条')
self.resize(500, 300)
self.move(900, 300)
self.set_ui()
def set_ui(self):
self.test_stylesheet()
def test_stylesheet(self):
label = QLabel(self)
# 设置控件文本
label.setText('样式设置')
# 设置控件样式
label.setStyleSheet("""
font-size:20px;
color:red;
border:2px solid red;
border-radius:8px;
""")
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
执行结果
1.2.2 Qss样式
用法-全局样式
with open('QObject.qss') as qssf:
qApp.setStyleSheet(qssf.read())
描述-全局样式
从QObject.qss文件读取样式字符串,设置给qApp全局对象。
描述-qss文件
将样式保存到.qss文件,使用实例、实例名称和属性作为选择器。
QLabel{}用于选择QLabel的全部实例;
QLabel#notice{}用于选择QLabel的全部实例,且id为“notice”的实例,对应objectName;
QLabel#notice[level='normal']{}用于选择QLabel的全部实例,且id为“notice”的实例,且属性level的值为’normal’的实例,对应property;
示例
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('学习QObjecct-梯阅线条')
self.resize(500, 300)
self.move(900, 300)
self.set_ui()
def set_ui(self):
self.test_qss()
def test_qss(self):
with open('QObject.qss') as qssf:
qApp.setStyleSheet(qssf.read())
lab1 = QLabel(self)
lab1.setText('normal')
lab1.setObjectName('notice')
lab1.setProperty('level', 'normal')
lab1.move(10, 0)
lab2 = QLabel(self)
lab2.setText('warning')
lab2.setObjectName('notice')
lab2.setProperty('level', 'warning')
lab2.move(10, 30)
lab3 = QLabel(self)
lab3.setText('error')
lab3.setObjectName('notice')
lab3.setProperty('level', 'error')
lab3.move(10, 60)
lab4 = QLabel(self)
lab4.setText('lab4')
lab4.setObjectName('notice')
lab4.move(10, 90)
lab5 = QLabel(self)
lab5.setText('lab5')
lab5.move(10, 120)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
执行结果