python - '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_())
解决方案
没有区别。
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)
推荐阅读
- c++ - C++意外调用继承类的函数
- python - run_algorithm() 失败,因为它无法从 Internet 源获取数据(403 Forbidden)
- tinymce - 所见即所得编辑器不会在 Chrome 中激活
- r - 如何使用 ggplot2 用多边形列表绘制我的形状?
- javascript - 如何检查数组中的对象是否有空字符串?
- c - 如何修复由-Wconversion引起的错误?
- html - 如何修改我的 css 或 cshtml 以获得类似于 w3school 上的下拉导航栏?
- python - Python代码在程序/代码的开头跳回?
- firebase - 我将如何每周运行一次 javascript 代码?
- gtfs - 什么信息来源是交通 Web 应用程序的行业标准 - GTFS 与 Trapeze 数据文件