【PyQt】QObject
[TOC]
对象名称与属性、父子对象操作、信号处理、类型判定、对象删除、事件处理、定时器、语言翻译
setObjectName("对象名称")
:给 Qt 对象设置唯一名称,等效于ID
objectName()
:获取该 Qt 对象的名称
setProperty("属性名称", 值)
:给一个 Qt 对象动态地添加一个属性与值
property("属性名称")
:获取 Qt 对象的属性值
dynamicPropertyName()
:获取对象中所有通过 setProperty 设置的属性
以上方法可用于 qss 的 ID 选择器、属性选择器,方便统一设置样式
也可用于装饰器的信号与槽
用例:创建多个用于信息提示的QLabel
label = QLabel(self)
label.setText("hello world")
label.setStyleSheet("font-size:20px; color: red;")
或者另建一个 qss 文件,存储样式设置信息
QLabel {
font-size:20px; color: red;
打开并读取 qss 文件
with open("QObject.qss", "r") as f:
qApp.setStyleSheet(f.read())
为特定标签应用样式(以 ID 为参考)
label1 = QLabel(self)
label1.setText("hello")
label2 = QLabel(self)
label2.move(100, 100)
label2.setText("world")
with open("QObject.qss", "r") as f:
qApp.setStyleSheet(f.read())
qss 内容:
QLabel#one {
font-size:20px; color: red;
根据属性设置不同样式
QLabel#notice {
font-size: 20px;
color: gray;
border: 1px solid gray;
border-radius: 8px;
QLabel#notice[notice_level="normal"] {
color: green;
border-color: green;
QLabel#notice[notice_level="warning"] {
color: yellow;
border-color: yellow;
QLabel#notice[notice_level="error"] {
color: error;
border-color: error;
label1 = QLabel(self)
label1.setObjectName("notice")
label1.setProperty("notice_level", "normal")
label1.setText("hello")
label2 = QLabel(self)
label2.setObjectName("notice")
label2.setProperty("notice_level", "warning")
label2.move(100, 100)
label2.setText("world")
label3 = QLabel(self)
label3.setObjectName("notice")
label3.setProperty("notice_level", "error")
label3.move(200, 200)
label3.setText("!")
with open("QObject.qss", "r") as f:
qApp.setStyleSheet(f.read())
父子对象的操作
setParent(parent)
:设置唯一父对象
或者直接在创建控件时继承,如 label = QPushButton(window)
,其中 window = QWiget()
parent()
:获取父对象
children()
:获取所有直接子对象
findChild(参数1, 参数2, 参数3)
:只寻找一个
参数1:类型或类型元组
参数2:对象名称
参数3:查找选项
Qt.FindChildrenRecursively
:递归查找(默认)
Qt.FindDirectChildrenOnly
:只查找直接子对象
for widget in self.children():
if widget.inherits("QLabel"):
widget.getStyleSheet("background-color:cyan;")
deleteLater()
:删除一个对象时,也解除其与父对象之间的关系
并不是立即销毁,而是向主消息循环发送一个event,下一次主消息循环接收到该event后才销毁对象
可以在这段延迟删除的时间内完成一些别的操作;但坏处是内存释放会不及时
三者都会被打印
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj3.setParent(obj2)
obj2.setParent(obj1)
obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))
三者都不会被打印
obj1 = QObject()
self.obj1 = obj1
obj2 = QObject()
obj3 = QObject()
obj3.setParent(obj2)
obj2.setParent(obj1)
# del obj2 # 在此处添加这么一句也不会有任何打印
obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))
2和3 被打印
obj1 = QObject()
self.obj1 = obj1
obj2 = QObject()
obj3 = QObject()
obj3.setParent(obj2)
obj2.setParent(obj1)
obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))
obj2.deleteLater()
print(obj1.children())
# 显示顺序相反