首页 > 解决方案 > 'self' 作为 PyQt5 中的参数有什么不同

问题描述

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

标签: pythonpython-3.xpyqtpyqt5self

解决方案


没有区别。

TL;博士;

QWidget继承自QObject,并且QObjects在父母和孩子之间有一个层次结构树,在C ++中它提供服务以便当父母被删除时它会消除它的孩子以便可以轻松处理内存,在PyQt的情况下它发生相同因为内存句柄不是由 python 直接处理,而是由 C++ 处理。

前面的原因是它用于将 parent 参数传递给 QObjects,另一方面,在 QWidgets 中,子项的位置始终是相对于父项的,因此如果您将 self 作为父项传递,则小部件将绘制在父母。

转到您的特定代码没有区别,因为布局建立了处理小部件的小部件的父级,因此您可以消除最初的亲属关系,因为布局将建立它。

如果我们不使用布局,我们可以看到差异,因为当移除 self 时,没有人会确定小部件将在哪里绘制,因此小部件不会显示。

没有自我:

def initUI(self):
    lcd = QLCDNumber()
    sld = QSlider(Qt.Horizontal)

与自我:

def initUI(self):
    lcd = QLCDNumber(self)
    sld = QSlider(Qt.Horizontal, self)

推荐阅读