我希望有人可以向我解释为什么我会不断遇到人们将按钮放入窗口小部件的两种不同方法背后的差异和原因?我有时会看到
button = Button('Button', self)
或
self.spinner = QtGui.QSpinBox()
我只是想知道最新的差异,是一个比另一个更有益的吗?何时使用哪种情况以及为什么? “自我”的位置是否会在小部件中影响这一点?
答案 0 :(得分:2)
假设你只关心PyQt和PySide ......
self
在您的示例中出现了两个不同的地方,这意味着非常不同的事情。
首先,作为构造函数的参数:
每个小部件的构造函数都有一个parent
参数,默认值为None
。
遗漏父母有三个理由:
QDesktopWidget
。如果这些都不属实,则需要传递父级。如果self
是小部件,并且您正在创建的内容是该小部件的子级,则您将传递self
作为父级。
以下是第一个替代方案的示例:
self.spinner = QtGui.QSpinBox()
hbox = Qt.QHBoxLayout()
hbox.addWidget(self.spinner)
self.addLayout(hbox)
我们无法在建造时将父母传递给QSpinBox
,因为它的父母尚未存在。因此,我们将其关闭,稍后addWidget
将其添加到布局对象中。
这在大多数PySide或PyQt教程的早期都有解释,例如First programs in PySide和Layout management in PySide。
同时,您的一个示例将小部件存储在self.spinner
中,使其成为self
上的实例属性,这意味着我们可以在以后引用它。例如,如果某个其他方法(如按钮的信号处理程序)想要调整微调器的值,则可以将其作为self.spinner
访问。
如果您在当前函数之后永远不需要在代码中引用子窗口小部件,则无需存储它。
本部分在Python教程的Classes章节中进行了解释。