前言
在Qt中,每个QObject派生类都具有父子关系的能力。父子关系可以通过以下两种方式建立: 在构造函数中传递父对象指针: 当创建一个QObject派生类的对象时,可以在构造函数中直接传递一个父对象的指针。这样,新创建的对象就会成为该父对象的子对象。 使用setParent()函数: 对于已经存在的QObject对象,可以使用setParent()函数来设置其父对象。1.1 setParent()
用法
setParent(self, a0: QObject)
描述
调用setParent (parent),为当前Qt对象设置父对象。
父对象只能设置一个,如果一个对象已经有父对象,再调用setParent会将其从原来的父对象中移除,并添加到新的父对象下。
1.2 parent()
用法
parent(self) -> QObject
描述
调用parent (),获取当前Qt对象的父对象。如果没有父对象则返回None。
1.3 示例-parent
测试代码
from PyQt5.Qt import *
def test_set_parent():
obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
# 设置obj1的父对象为obj0
obj1.setParent(obj0)
obj2.setParent(obj0)
# 获取obj1的父对象
obj1_parent = obj1.parent()
obj2_parent = obj2.parent()
print(f'obj0={obj0}')
print(f'obj1={obj1}')
print(f'obj2={obj2}')
print(f'obj1Parent={obj1_parent}')
print(f'obj2Parent={obj2_parent}')
# 为obj1设置新的父对象
obj1.setParent(obj2)
obj1_parent = obj1.parent()
print(f'obj1Parent={obj1_parent}')
# 没有父对象返回None
obj0_parent = obj0.parent()
print(f'obj0_parent={obj0_parent}')
if __name__ == '__main__':
test_set_parent()
pass
执行结果
关系图:
修改obj1父对象前如上图左边,obj1和obj2的父对象都为obj0;
修改obj1父对象后入上图右边,obj1父对象为obj2。
若没有父对象则返回None。
通过对象和父对象地址可以验证上图关系,结果如下:
obj0=<PyQt5.QtCore.QObject object at 0x000001C2B338BCA0>
obj1=<PyQt5.QtCore.QObject object at 0x000001C2B338BD30>
obj2=<PyQt5.QtCore.QObject object at 0x000001C2B338BDC0>
obj1Parent=<PyQt5.QtCore.QObject object at 0x000001C2B338BCA0>
obj2Parent=<PyQt5.QtCore.QObject object at 0x000001C2B338BCA0>
obj1Parent=<PyQt5.QtCore.QObject object at 0x000001C2B338BDC0>
obj0_parent=None
1.4 children()
用法
children(self) -> List[QObject]
描述
调用parent (),获取当前Qt对象的全部直接子对象。没有子对象则返回空列表。
1.5 示例-children
测试代码
from PyQt5.Qt import *
def test_children():
obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj4 = QObject()
obj5 = QObject()
obj1.setParent(obj0)
obj2.setParent(obj0)
obj3.setParent(obj1)
obj4.setParent(obj2)
obj5.setParent(obj2)
# 获取obj0的直接子对象
obj0_children = obj0.children()
print(f'obj0={obj0}')
print(f'obj1={obj1}')
print(f'obj2={obj2}')
print(f'obj3={obj3}')
print(f'obj4={obj4}')
print(f'obj5={obj5}')
print(f'obj0_children={obj0_children}')
# 没有子对象返回空列表
obj3_children=obj3.children()
print(f'obj3_children={obj3_children}')
if __name__ == '__main__':
test_children()
执行结果
关系图如下:
通过obj0.children()获取全部直接子对象,为obj1和obj2,不包括obj3/obj4/obj5。
没有子对象则返回空列表。
通过对象和子对象地址可以验证上图关系,结果如下:
obj0=<PyQt5.QtCore.QObject object at 0x000001503032CD30>
obj1=<PyQt5.QtCore.QObject object at 0x000001503032CDC0>
obj2=<PyQt5.QtCore.QObject object at 0x000001503032CE50>
obj3=<PyQt5.QtCore.QObject object at 0x000001503032CEE0>
obj4=<PyQt5.QtCore.QObject object at 0x000001503032CF70>
obj5=<PyQt5.QtCore.QObject object at 0x00000150308C6040>
obj0_children=[<PyQt5.QtCore.QObject object at 0x000001503032CDC0>, <PyQt5.QtCore.QObject object at 0x000001503032CE50>]
obj3_children=[]
1.6 findchild()
用法
findChild(self, type, name, options) -> QObject
描述
调用findchild(参数1,参数2,参数3),获取一个指定名称和类型的子对象。有多个子对象,找到第一个就返回。没有找到则返回None。
参数1:必填,类型或类型元组;
参数2:可选,名称,可以省略;
参数3:可选,查找选项;
(1) Qt.FindChildrenRecursively,递归查找,默认选项,会查找全部子对象;
(2) Qt.FindDirectChildrenOnly,只查找直接子对象;
1.7 示例-findchild
测试代码
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_findchild()
pass
def test_set_parent():
obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
# 设置obj1的父对象为obj0
obj1.setParent(obj0)
obj2.setParent(obj0)
# 获取obj1的父对象
obj1_parent = obj1.parent()
obj2_parent = obj2.parent()
print(f'obj0={obj0}')
print(f'obj1={obj1}')
print(f'obj2={obj2}')
print(f'obj1Parent={obj1_parent}')
print(f'obj2Parent={obj2_parent}')
# 为obj1设置新的父对象
obj1.setParent(obj2)
obj1_parent = obj1.parent()
print(f'obj1Parent={obj1_parent}')
# 没有父对象返回None
obj0_parent = obj0.parent()
print(f'obj0_parent={obj0_parent}')
def test_findchild():
obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj4 = QObject()
obj5 = QObject()
obj1.setParent(obj0)
obj2.setParent(obj0)
obj3.setParent(obj1)
obj4.setParent(obj2)
obj5.setParent(obj2)
# 找到第一个就返回,返回obj1
obj0_findchild = obj0.findChild(QObject)
# 没找到返回None
obj0_findchild_qlabel = obj0.findChild(QLabel)
# 设置obj2的objectName
obj2.setObjectName('obj2')
# 通过objectName查找
obj0_findchild_obj2 = obj0.findChild(
QObject, f'{obj2.objectName()}')
obj3.setObjectName('obj3')
# 参数3默认为递归查找(Qt.FindChildrenRecursively)
# 查找全部的字对象
obj0_findchild_obj3 = obj0.findChild(
QObject, f'{obj3.objectName()}')
# 参数3为Qt.FindDirectChildrenOnly,则只查找直接子对象
obj0_findchild_obj3_drt = obj0.findChild(
QObject, f'{obj3.objectName()}',
Qt.FindDirectChildrenOnly)
print(f'obj0={obj0}')
print(f'obj1={obj1}')
print(f'obj2={obj2}')
print(f'obj3={obj3}')
print(f'obj4={obj4}')
print(f'obj5={obj5}')
print(f'obj0_children={obj0_findchild}')
print(f'obj0_findchild_qlabel={obj0_findchild_qlabel}')
print(f'obj0_findchild_obj2={obj0_findchild_obj2}')
print(f'obj0_findchild_obj3={obj0_findchild_obj3}')
print(f'obj0_findchild_obj3_drt={obj0_findchild_obj3_drt}')
if __name__ == '__main__':
pass
执行结果
关系图如下:
通过obj0.findchil(参数1,参数2,参数3)查找匹配的第一个子对象。没有找到返回None。参数3默认递归查找全部子对象。
通过对象和子对象地址可以验证上图关系,结果如下:
obj0=<PyQt5.QtCore.QObject object at 0x0000020587DFCDC0>
obj1=<PyQt5.QtCore.QObject object at 0x0000020587DFCE50>
obj2=<PyQt5.QtCore.QObject object at 0x0000020587DFCEE0>
obj3=<PyQt5.QtCore.QObject object at 0x0000020587DFCF70>
obj4=<PyQt5.QtCore.QObject object at 0x0000020588398040>
obj5=<PyQt5.QtCore.QObject object at 0x00000205883980D0>
obj0_children=<PyQt5.QtCore.QObject object at 0x0000020587DFCE50>
obj0_findchild_qlabel=None
obj0_findchild_obj2=<PyQt5.QtCore.QObject object at 0x0000020587DFCEE0>
obj0_findchild_obj3=<PyQt5.QtCore.QObject object at 0x0000020587DFCF70>
obj0_findchild_obj3_drt=None