繁体   English   中英

继承自定义PyQt5 QWidget不会调用父方法

[英]Inheriting from custom PyQt5 QWidget does not call parent method

我在PyQt5中编写了一个小应用程序,并遇到了以下最小工作示例所示的问题:

我的自定义类'A'继承自QWidget类,调用两个安装方法(一个用于小部件,一个用于布局),并将setup_widgets方法('Click A'Button)中的小部件添加到名为'frame'的布局中。 这样可以正常工作并创建QApplication和QMainWindow,并为其添加这样的A类窗口小部件将正确显示它。

然而,在下一步中,我设计了一个类'B',它应该继承自'A'类。 因此,我在'B'的init方法中调用'A'的init方法。 根据我的理解,这将通过A. init ()包括A.setup_widgets()以及A.setup_layout(),它将“Click A”按钮以及名为“frame”的布局添加到对象。 经过一些调试后,虽然我注意到来自A. init ()的setup_layout调用确实调用了B.setup_layout,因为继承调用的'self'参数似乎是'B'类型的对象。 因此,引发错误,因为对于B对象,没有创建称为“帧”的布局。

解决方法是将A.setup_widgets(self)添加为B.setup_widgets方法的第一行,等效地将A.setup_layout(self)添加到B.setup_layout方法。 这种方法也在源代码中显示,但用#评论。 但是,这会导致尝试将QLayout设置两次,从而导致出现警告/错误:

QWidget :: setLayout:试图在B“”上设置QLayout“”,它已经有了布局。

处理这个继承问题的正确方法是什么? 如果它有帮助:我从不打算使用A类作为实际对象,仍然希望它是一个独立的功能类,因为我将从中派生出许多不同的子类。

谢谢和欢呼,保罗

from PyQt5.QtWidgets import *


class A(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.setup_widgets()
        self.setup_layout()

    def setup_widgets(self):
        self.button_a = QPushButton('Click A')

    def setup_layout(self):
        self.frame = QHBoxLayout()
        self.frame.addWidget(self.button_a)
        self.setLayout(self.frame)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = QMainWindow()
    wid = A()
    win.setCentralWidget(wid)
    win.show()
    sys.exit(app.exec())

-------------------------------------------------- -----------------------

from PyQt5.QtWidgets import *

from class_a import A


class B(A):

    def __init__(self):
        A.__init__(self)
        self.setup_widgets()
        self.setup_layout()

    def setup_widgets(self):
        #A.setup_widgets(self)
        self.button_b = QPushButton('Click B')

    def setup_layout(self):
        #A.setup_layout(self)
        self.frame.addWidget(self.button_b)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = QMainWindow()
    wid = B()
    win.setCentralWidget(wid)
    win.show()
    sys.exit(app.exec())

您不需要从B. __init__调用setup_widgetssetup_layout ,因为它们已被A调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM