【问题标题】:What kind of difference does 'self' makes as parameter in PyQt5'self' 作为 PyQt5 中的参数有什么不同
【发布时间】:2018-09-23 07:16:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    没有区别。

    TL;DR;

    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)
    

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 2019-05-24
      • 2015-08-21
      • 1970-01-01
      • 2023-03-19
      • 2016-06-22
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多