使用self on按钮创建python小部件

时间:2014-01-08 02:03:46

标签: python widget pyqt pyside self

我希望有人可以向我解释为什么我会不断遇到人们将按钮放入窗口小部件的两种不同方法背后的差异和原因?我有时会看到

button = Button('Button', self)

self.spinner = QtGui.QSpinBox()

我只是想知道最新的差异,是一个比另一个更有益的吗?何时使用哪种情况以及为什么? “自我”的位置是否会在小部件中影响这一点?

1 个答案:

答案 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 PySideLayout management in PySide


同时,您的一个示例将小部件存储在self.spinner中,使其成为self上的实例属性,这意味着我们可以在以后引用它。例如,如果某个其他方法(如按钮的信号处理程序)想要调整微调器的值,则可以将其作为self.spinner访问。

如果您在当前函数之后永远不需要在代码中引用子窗口小部件,则无需存储它。

本部分在Python教程的Classes章节中进行了解释。