我有两个班级:
第一个(父类)在方法中实例化子类。
我试图修改子类内的父对象属性。 (这些对象是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()
时遇到了很多麻烦,当我只是想做一件简单的事情时,它总会遇到复杂的概念,例如多重继承。
答案 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)