父参数(PySide)从何而来?

2024-03-29 12:10:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在这个例子中,parent参数从何而来,谁提供它?在

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.do_something() #sanity check
        self.cw = ChildWidget(self)
        self.setCentralWidget(self.cw)
        self.show()

    def do_something(self):
        print 'doing something!'


class ChildWidget(QtGui.QWidget):
    def __init__(self, parent):
        super(ChildWidget, self).__init__(parent)

        self.button1 = QtGui.QPushButton()
        self.button1.clicked.connect(self.do_something_else)

        self.button2 = QtGui.QPushButton()
        self.button2.clicked.connect(self.parent().do_something)

        self.layout = QtGui.QVBoxLayout()
        self.layout.addWidget(self.button1)
        self.layout.addWidget(self.button2)
        self.setLayout(self.layout)
        self.show()

    def do_something_else(self):
        print 'doing something else!'

Tags: selfinitdefdoelsesomethingclassparent
1条回答
网友
1楼 · 发布于 2024-03-29 12:10:09

父、子对QT(C++)有特异性。从doc of QObject

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. The parent takes ownership of the object; i.e., it will automatically delete its children in its destructor.

QWidget和许多其他类继承自QObject,因此它也适用于它们。对于每个子对象,parent()方法返回指向父对象的指针。在

基本上,你用父母创建widget,这样他们就可以被正确删除了。 通常情况下,主窗口是所有窗口小部件的父级或祖父母级:当您关闭窗口时,所有内容都将按正确的顺序删除。在


从你的评论来看,我认为你也对super()的用法感到困惑。它不调用小部件的父控件。在

另一种写法是:

class ChildWidget(QtGui.QWidget):
    def __init__(self, parent):
        super(ChildWidget, self).__init__(parent)

直接调用QWidget的init方法:

^{pr2}$

ChildWidget继承自QWidget(这就是我们定义类的方式)。在init方法中,需要调用QWidget的默认构造函数。否则,您将无法使用QWidget(请尝试查看…)的默认方法和属性。
如果给它一个父母,它也会相应地组织自己。它将自己添加到父方法children,并保留对其父方法的引用。在

相关问题 更多 >