【发布时间】:2018-10-10 17:06:26
【问题描述】:
我正在尝试创建一个PyQt5.QtWidgets.QWidget 派生小部件,同时从另一个基类Base 继承。
从Base 继承会导致调用QWidget 构造函数时出错,说我从未提供Base 需要的参数。
这就是我尝试调用QWidget 和Base 构造函数的方式:
class Deriv(QtWidgets.QWidget, Base):
def __init__(self):
QtWidgets.QWidget.__init__(self)
Base.__init__(self, "hello world")
我得到的错误是:
QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'id'
是否可以同时继承QWidget 和Base,如果可以,如何正确调用它们各自的构造函数?
这是一个示例应用程序,它重现了我遇到的错误:
#!/usr/bin/env python3
import sys
from PyQt5 import QtWidgets
class Base(object):
def __init__(self, id):
self.id = id
class Deriv(QtWidgets.QWidget, Base):
def __init__(self):
QtWidgets.QWidget.__init__(self)
Base.__init__(self, "hello world")
self.show()
def main():
app = QtWidgets.QApplication(sys.argv)
d = Deriv()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这是回溯:
Traceback (most recent call last):
File "./test.py", line 22, in <module>
main()
File "./test.py", line 18, in main
d = Deriv()
File "./test.py", line 11, in __init__
QtWidgets.QWidget.__init__(self)
TypeError: __init__() missing 1 required positional argument: 'id'
请注意,如果我仅继承自 QWidget(所以只需删除所有引用 Base 的内容),那么代码就可以工作
class Deriv(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.show()
【问题讨论】:
-
错误信息非常明确;您需要将
self.id作为参数传递给QtWidgets.QWidget.__init__。 -
QWidget不接受 id 参数。这是错误:TypeError: QWidget(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'str' -
@chepner 我已经更新了问题以表明不向
QWidget传递任何内容都有效,但只有当我不从其他任何东西继承时 -
QTWidgets.QWidget显然使用了super,所以如果你有额外的基类,那么它们的__init__方法会被fromQTWidgest.QWidget.__init__调用,即使你没有' t 首先调用super。 (一旦我找到QTWidgets的源代码,我就可以发布一个答案。) -
@MartijnPieters
QtWidgets.QWidget确实有一个父母,但它默认为None- 为了简洁起见,我已将其删除 - 将其重新添加并没有区别 afaics
标签: python pyqt pyqt5 multiple-inheritance