parent() 或 super() 以获得 parent object?

parent() or super() to get a parent object?

我有两个 classes :

第一个(parentclass)在方法中实例化childclass。 我正在尝试修改 child class 中的 parent objects 属性。 (这些 objects 是 PyQT QWidget s)。

这是我的 Parent 和 Child classes 的开头:

Parent :

class ParentClass(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ParentClass, self).__init__()

        somevar=1200

        self.ChildItem=ChildClass()
        self.ChildItem.Start(somevar)

Child :

class ChildClass(QtGui.QWidget):
    def Start(self, var):
        super(ChildClass, self).__init__(self)

        self.parent().resize(var,var)

然而,即使我没有错误,最后一行也没有产生任何结果。

我在几个示例中看到 super() 可用于调用 parent 方法,因此我认为这将是我的案例的解决方案。但是,我也无法让它工作。

我在理解super()时遇到了很多麻烦,当我只想做一件简单的事情时,它总是陷入复杂的概念,例如多重继承。

Qt 术语中的父项不是 python 术语中的父项,from docs:

Returns a pointer to the parent object.

QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list.

但是这里的parent在Qt术语中是这个对象所属的一个对象,这个跟python继承没有关系

对于python继承你需要super:

super(ParentClass, self).method()

在单继承的情况下这是微不足道的。

这里的问题与super或继承无关。有了继承,parent/child关系就是。但在您的示例中,ChildClass 不会继承 ParentClass,因此这无关紧要。

不过,在 Qt 中还有另一种 parent/child 关系,那就是 实例 之间的关系。小部件的构造函数有一个参数,允许您传入对 parent object(通常是另一个小部件实例)的引用。但是,该参数是可选的,因此如果您没有显式设置它,之后调用 parent() 只会 return None.

您的示例代码中的具体错误是 child 从未被赋予 parent。

您的示例应如下所示:

class ParentClass(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ParentClass, self).__init__()    
        # pass in "self" as the parent
        self.ChildItem = ChildClass(self)
        self.ChildItem.Start(1200)

class ChildClass(QtGui.QWidget):
    def Start(self, var):
        self.parent().resize(var, var)