1

我已经用 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: could not convert 'C' to 'QLine'”... 为什么会这样?问题是什么?如何四处走动?

4

1 回答 1

2

根据其他各种 帖子,您不能继承两次。 QObject

它们都链接到http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#multiple-inheritance,我再也找不到了。但是PyQt 4.10.2 参考指南中要注意的事情说:

不可能定义一个新的 Python 类,它是多个 Qt 类的子类。

引用其中一个答案:

限制并非来自 python 或 PyQt。这纯粹是因为 Qt 并且意味着您不能从 QObject 继承或继承的多个类继承。

根据其他答案,这显然不是在 Qt 中不可能,而是除非您使用虚拟继承(这会导致 Qt 出现其他问题),否则它不会像您在 C++ 中所期望的那样,所以 PyQt4 阻止了它。特别是,在您的示例中,C它不是真正正确的 a QFrame,但只要您从不使用任何QFrame虚拟方法或任何依赖于QFrame继承自的成员的函数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)

现在CA拥有您(可能)想要的关系,但C只有一个QObject祖先,所以一切都很好。

于 2013-07-12T19:18:19.483 回答