【问题标题】:From where comes the parent argument (PySide)?父参数(PySide)从何而来?
【发布时间】:2015-11-09 06:56:04
【问题描述】:

在这个例子中,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!'

【问题讨论】:

  • 您向我们展示的是类的定义,现在向我们展示您在哪里使用ChildWidget 类?这也是你传递parent 的地方。
  • self.cw = ChildWidget(self)中的self.cw = ChildWidget(self)括号中的selfclass MainWindow吗?
  • 是的,这就是你的答案。在这种特殊情况下,MainWindow 中的 self 是父级,因此 MainWindow 实例是父级。一般来说,只要有__init__(self, anything),就会在创建该类型的新对象时定义参数anything
  • 所以,super(ChildWidget, self).__init__(parent) 方法中的parent 只是发送给MainWindow__init__ 方法的参数和隐含的self。困扰我的是__init__(self)只带一个参数,而不是两个
  • 那么 parent() 方法从何而来?

标签: python pyside init super


【解决方案1】:

父项和子项特定于 Qt (C++)。来自doc of QObject

QObjects 在对象树中组织自己。当你创建一个 QObject 以另一个对象为父对象,该对象会自动 将自身添加到父级的 children() 列表中。父母取得所有权 对象的;即,它将自动删除其子项 析构函数。

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

基本上,您使用父母创建小部件,以便可以正确删除它们。 通常情况下,您的主窗口是所有小部件的父窗口或祖父窗口:当您关闭窗口时,所有内容都会按正确的顺序删除。


根据您的评论,我认为您也对super() 的使用感到困惑。它确实调用小部件的父级。

另一种写法:

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

就是直接调用QWidget的init方法:

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

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

【讨论】:

  • 现在我不明白,我想:) 参数 parent 可以是任何单词,它转到 ChildWidget 的 __init__ 只是为了传递给 QtGui.QWidget.__init__(parent) ,以便 QWidget 知道它的父级是谁。
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 2018-09-09
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2018-12-24
  • 2015-12-04
  • 2018-07-31
相关资源
最近更新 更多