我在Python / PyQt中翻译了一个在C ++ / Qt中运行良好的代码,我不明白它为什么会产生错误。这是一个重现问题的最小代码:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class A(QFrame):
def __init__(self, parent) :
QFrame.__init__(self, parent)
class B(A, QLine):
def __init__(self, parent) :
A.__init__(self, parent)
QLine.__init__(self, parent)
class C(B):
def __init__(self, parent) :
B.__init__(self, parent)
self.setLine(0, 0, 0, 0)
if __name__ == "__main__":
app = QApplication(sys.argv)
myApp = QMainWindow()
myApp.show()
c = C(myApp)
sys.exit(app.exec_())
运行此代码时,我收到消息“TypeError:无法将'C'转换为'QLine'”...为什么会这样?问题是什么?如何到处走走?
答案 0 :(得分:2)
根据various other posts,您无法从QObject
继承两次。
他们都链接到http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#multiple-inheritance,我再也找不到了。但是PyQt 4.10.2参考指南中的Things to be Aware Of说:
不可能从多个Qt类定义一个新的Python类。
引用其中一个答案:
限制不是来自python或PyQt。纯粹是因为Qt和 意味着您不能从多个继承或继承的类继承 QObject的。
根据其他答案,显然不是它在Qt中不可能,除非你使用虚拟继承(导致其他 Qt的问题),所以PyQt4会阻止它。特别是,在您的示例中,C
并不是QFrame
,只要您从不使用任何QFrame
虚拟方法,或依赖于QFrame
成员的任何函数1}}继承自QObject
,你会碰巧逃脱它。
无论如何,这里似乎有一个明显的解决方法。你需要的是“C必须与A的类型相同(出于实际原因)”。你可以通过拆分A
来获得它:
class AMixin(object):
def __init__(self, parent):
pass
# A-specific behavior
class A(QFrame, AMixin):
def __init__(self, parent) :
QFrame.__init__(self, parent)
A.__init__(self, parent)
class B(AMixin, QLine):
def __init__(self, parent) :
AMixin.__init__(self, parent)
QLine.__init__(self, parent)
class C(B):
def __init__(self, parent) :
B.__init__(self, parent)
self.setLine(0, 0, 0, 0)
现在C
和A
有你(可能)想要的关系,但C
只有一个QObject
祖先,所以一切都很好。