当前位置: 代码迷 >> python >> PyQt5中“ self”作为参数有什么区别
  详细解决方案

PyQt5中“ self”作为参数有什么区别

热度:36   发布时间:2023-07-14 08:59:40.0

在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_())

没有区别

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)