问题描述
在PyQt5中, self
关键字作为创建Widgets
的参数做了什么?
我认为这两者之间没有任何区别,而且两者都可以正常工作。
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
###############This Part#############
#QLCDNumber() and QSLider() also works fine below
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
#####################################
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
sld.valueChanged.connect(lcd.display)
self.setLayout(vbox)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Signal and slot')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
1楼
没有区别
TL; DR;
QWidget从QObject继承而来,并且QObjects在父级和子级之间有一个层次结构树,在C ++中它起作用,以便在删除父级时消除其子级,以便可以轻松地处理内存,在PyQt的情况下,发生的情况相同因为内存句柄不是直接由python处理,而是由C ++处理。
先前的原因是它可以将父参数传递给QObject,而另一方面,在QWidgets中,子代的位置始终相对于父代,因此,如果您将self传递给父代,则将在家长。
转到您的特定代码没有什么区别,因为布局会建立在处理窗口小部件建立位置的窗口小部件的父级,因此您可以消除亲缘关系的初始关系,因为布局会建立它的亲属关系。
如果不使用布局,我们可以看到差异,因为在删除自身时,没有人会确定将在何处绘制窗口小部件,因此将不显示窗口小部件。
没有自我:
def initUI(self):
lcd = QLCDNumber()
sld = QSlider(Qt.Horizontal)
与自我:
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)