如何为QWidget或QMainWindow适当覆盖showEvent?应该始终调用super,如果这样,应该如何调用?

问题描述 投票:0回答:1

使用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的问题是:

  1. 是否调用super有关系吗?在有限的测试中,我找不到它对此功能有特殊的影响。

  2. 超级应称为super(MainForm, self).showEvent(event)还是super().showEvent(event)?我找不到一种情况有效而另一种无效的情况,并且我发现了每种方法的多个示例。这些之间有有意义的区别吗?

  3. 如果应该调用super,是否应该在调用super之前或之后完成其他功能(例如,设置QGraphicsView的图像)?这有关系吗,如果有的话,在调用super之前和之后进行其他操作的实际区别是什么?

python pyqt pyqt5
1个回答
0
投票

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之前和之后进行其他操作会造成什么实际差异?

取决于。这将取决于对父方法的理解,例如,是否要在默认行为之前或之后运行额外的功能。

© www.soinside.com 2019 - 2024. All rights reserved.