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

时间:2018-09-23 07:16:12

标签: python python-3.x pyqt pyqt5 self

在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 个答案:

答案 0 :(得分:3)

没有区别。

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)