【PyQt】QObject
2019-05-24 本文已影响0人
4thirteen2one
[TOC]
对象名称与属性、父子对象操作、信号处理、类型判定、对象删除、事件处理、定时器、语言翻译
方法
-
setObjectName("对象名称")
:给 Qt 对象设置唯一名称,等效于ID -
objectName()
:获取该 Qt 对象的名称 -
setProperty("属性名称", 值)
:给一个 Qt 对象动态地添加一个属性与值 -
property("属性名称")
:获取 Qt 对象的属性值 -
dynamicPropertyName()
:获取对象中所有通过 setProperty 设置的属性
以上方法可用于 qss 的 ID 选择器、属性选择器,方便统一设置样式
也可用于装饰器的信号与槽
用例:创建多个用于信息提示的QLabel
- 要求:
- 字体大小25px,颜色为灰色,边框圆角为8px
- 信息提示分多个级别
- 正常(normal):绿色边框,绿色字体
- 警告(warning):黄色边框,黄色字体
- 错误(error):红色边框,红色字体
- 涉及:
- 对象名/属性设置
- 文件读取
- qss样式表
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
:只查找直接子对象
-
-
findChildren(参数1, 参数2, 参数3)
:查找所有满足条件的子对象
obj1 = QObject()
obj2 = QObject()
print("obj1", obj1)
print("obj2", obj2)
obj1.setParent(obj2)
print(obj1.parent())
Qt 内存管理机制
- 对象树:所有的对象都继承于 QObject
- 若在某对象下创建了子对象,那么其 children() 列表中应该包含该子对象
- 当父对象被销毁时,子对象也会被销毁
显示关系
- 一个控件若没有任何父控件,则会被设置为顶层控件(窗口)
- 若需一个控件被包含在另一控件内部,则需设置父子关系
- 子控件的显示位置受父控件约束,生命周期也被其父对象接管
类型判定
isWidgetType()
-
inherits(父类)
:是否以某类型为父类
多用于对控件进行过滤
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())
# 显示顺序相反