PyQt5之QObject对象父子关系的API

前言

在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

执行结果

关系图:

PyQt5之QObject对象父子关系的API1 修改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()

执行结果

关系图如下:

PyQt5之QObject对象父子关系的API2

通过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

执行结果

关系图如下:

PyQt5之QObject对象父子关系的API2

通过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