我在使用PyQt进行多重继承时遇到了一个问题, Programe 1#源代码如下:
#!python3
import sys;
from PyQt5.QtWidgets import *;
from PyQt5.QtGui import *;
from PyQt5.QtCore import *;
class WP_Widget(QWidget):
def __init__(self):
print("WP_Widget init");
super().__init__();
class WP_Line(QLineEdit):
def __init__(self, text='',*args, **kargs):
super().__init__();
self.setText(text);
class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
def __init__(self):
print('Widget_C self = ', self)
super().__init__();
class App(QWidget):
def __init__(self):
super().__init__();
fname = Widget_C();
self.left = 100
self.top = 100
self.width = 100
self.height = 100
self.show();
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
执行时,它会将错误显示为:
AttributeError: 'Widget_C' object has no attribute 'setText'
如果更改Widget_C
定义
从
class Widget_C(WP_Widget, WP_Line):
到
class Widget_C(WP_Line, WP_Widget):
它会成功运行。
我想它会与Python3中的 MRO 相关,所以我写了另一个程序2#来模拟状态:
#!python3
class QWidget():
def __init__(self):
print("Base QWidget init.");
class QLineEdit(QWidget):
def __init__(self):
print('LineEdit init');
super().__init__();
def setText(self, text):
print('setText called');
class WP_Widget(QWidget):
def __init__(self):
print('WP_Widget Init');
super().__init__()
class WP_Line(QLineEdit):
def __init__(self, text='',*args, **kargs):
print('WP_Line init');
super().__init__();
self.setText(text)
class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
def __init__(self):
super().__init__()
c_test = Widget_C()
但无论Wiget_C
,
class Widget_C(WP_Line, WP_Widget):
或
class Widget_C(WP_Widget, WP_Line):
它们都会正常运行。
所以任何人都可以提供帮助:
class Widget_C(WP_Widget, WP_Line):
时失败, MRO 只是我的猜测。Python and order of methods in multiple inheritance解释了一些关于 MRO 的内容,它与我的问题有关,但不完全是答案。 如果继承订单相同,我的程序1#和程序2 不应该有不同的结果,因此关键点是程序1#的原因和程序2 有不同的现象。
答案 0 :(得分:0)
ekhumoro给出了我需要的答案。
作为stated in the docs,pyqt不支持qt类的多重继承。也就是说,它不会像普通python中通常期望的那样工作。
话虽如此,this blog post有一些有趣的见解和解决方法(但请注意,它最初是为pyqt4编写的,因此有些事情现在可能已经过时了)。