parent()或super()来获取父对象?

时间:2015-07-06 09:16:41

标签: python pyside qtgui

我有两个班级:

第一个(父类)在方法中实例化子类。 我试图修改子类内的父对象属性。 (这些对象是PyQT QWidget s)。

这是我的父母和子女课程的开始:

家长:

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

        somevar=1200

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

孩子:

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

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

但是,即使我没有错误,最后一行也不会产生任何错误。

我在几个例子中看到super()可以用来调用父方法,所以我认为这对我的案例来说是一个解决方案。但是,我也无法使其发挥作用。

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

2 个答案:

答案 0 :(得分:2)

Qt术语中的父级不是python术语中的父级from docs

  

返回指向父对象的指针。

     

QObjects在对象树中组织自己。当您使用另一个对象作为父对象创建QObject时,该对象将自动将其自身添加到父对象的children()列表中。

但是这里的父级是Qt术语,这个对象所属的对象,这与python继承无关。

对于python继承,您需要super

super(ParentClass, self).method()

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

答案 1 :(得分:1)

这里的问题与super或继承无关。通过继承,父/子关系在之间。但在您的示例中,ChildClass不会继承ParentClass,因此无关紧要。

但是,Qt中存在另一种父/子关系,即实例之间。窗口小部件的构造函数有一个参数,允许您传入对父对象(通常是另一个窗口小部件实例)的引用。但是,参数是可选的,因此如果您没有明确设置它,之后调用parent()只会返回None

示例代码中的特定错误是,子项永远不会被赋予父级。

以下是您的示例:

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)