使用PyQt5,我以QWidget
作为主要形式(也可能是QMainWindow
)。
我需要在Qt根据屏幕大小和其他因素决定主窗体的大小后做一些事情,因此我不能使用构造函数,而必须重写showEvent
。有关为何在某些情况下有必要这样做的示例,或要了解更多详细信息,请参见此帖子:Getting the size of a QGraphicsView
这里是一个简单的示例:
# test.py
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.Qt import Qt
def main():
app = QApplication([])
mainForm = MainForm()
mainForm.show()
app.exec()
# end main
class MainForm(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 400, 200)
self.label = QLabel('hello world')
self.label.setAlignment(Qt.AlignCenter)
self.gridLayout = QGridLayout()
self.gridLayout.addWidget(self.label)
self.setLayout(self.gridLayout)
# end function
def showEvent(self, event):
print('in showEvent')
# Set image on QGraphicsView here, or something else that has to be done in showEvent
# Which of these is correct ??
super(MainForm, self).showEvent(event)
super().showEvent(event)
# end function
# end class
if __name__ == '__main__':
main()
我有关如何正确地优先覆盖showEvent
的问题是:
是否调用super
有关系吗?在有限的测试中,我找不到它对此功能有特殊的影响。
超级应称为super(MainForm, self).showEvent(event)
还是super().showEvent(event)
?我找不到一种情况有效而另一种无效的情况,并且我发现了每种方法的多个示例。这些之间有有意义的区别吗?
如果应该调用super,是否应该在调用super之前或之后完成其他功能(例如,设置QGraphicsView的图像)?这有关系吗,如果有的话,在调用super
之前和之后进行其他操作的实际区别是什么?
1。调用super是否重要?在有限的测试中,我找不到它对此功能有特殊的影响。
这取决于,当您调用super().method(args)
时,您正在调用父类的功能,在这种情况下,父类在该方法中实现了某些功能,而在其他情况下,如果开发者不这样做,开发人员应自行决定是否。如果父类没有实现任何其他功能,则调用它与否将执行相同的操作,但是,如果父类实现了某些其他功能并且您未调用它,则该类可能无法正常工作。
因此,通常,调用父级的super().method(args)
方法被认为是一种好习惯,除非您想覆盖该行为。
要了解如果不调用父级方法会发生什么,可以使用以下示例:
import sys
from PyQt5 import QtCore, QtWidgets
class LineEdit(QtWidgets.QLineEdit):
def keyPressEvent(self, event):
print(event.text())
# super().keyPressEvent(event)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = LineEdit()
w.show()
sys.exit(app.exec_())
在下面的示例中,为了不调用父级的keyPressEvent方法,您已禁用默认行为,因此文本不会显示在QLineEdit中。但是,如果您对QWidget执行相同的操作,则不会有问题,因为该类的keyPressEvent方法不会实现任何操作。
2。应该将super称为super(MainForm,self).showEvent(event)还是super()。showEvent(event)?我找不到一种情况有效而另一种无效的情况,并且我发现了每种方法的多个示例。这些之间有有意义的区别吗?
此问题已在Understanding Python super() with __init__() methods中回答,两者在python3中均等效。
3。如果应该调用super,是否应该在调用super之前或之后执行其他功能(例如,设置QGraphicsView的图像)?这有关系吗,如果有的话,在调用super之前和之后进行其他操作会造成什么实际差异?
取决于。这将取决于对父方法的理解,例如,是否要在默认行为之前或之后运行额外的功能。