[英]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_widgets
和setup_layout
,因为它们已被A调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.