如何在一个类中继承 QGraphicsRectItem 和 QGraphicsEllipseItem?

Posted

技术标签:

【中文标题】如何在一个类中继承 QGraphicsRectItem 和 QGraphicsEllipseItem?【英文标题】:How can I subclass QGraphicsRectItem and QGraphicsEllipseItem in one class? 【发布时间】:2020-02-26 17:53:32 【问题描述】:

我正在使用 Pyside2,并且有一个使用 QGraphicsView 和 QGraphicsScene 的 UI。

现在我有两个独立的类,它们是 QGraphicsEllipseItem 和 QGraphicsRectItem 的子类,如下所示:

class MyRectButton(QGraphicsRectItem):

    def contextMenuEvent(self, event):
        # custom context menu
        pass

    def custom_method_A(self):
        # add a custom method
        pass

    def custom_method_B(self):
        # add a custom method
        pass

class MyEllipseButton(QGraphicsEllipseItem):

    def contextMenuEvent(self, event):
        # custom context menu
        pass

    def custom_method_A(self):
        # add a custom method
        pass

    def custom_method_B(self):
        # add a custom method
        pass

我想要一个可以是矩形或椭圆形的类,而不是两个类中的冗余方法:

class MyButton():
    def __init__(self,shape='Ellipse'):
        pass

    def contextMenuEvent(self, event):
        # custom context menu
        pass

    def custom_method_A(self):
        # add a custom method
        pass

    def custom_method_B(self):
        # add a custom method
        pass


【问题讨论】:

【参考方案1】:

您可以创建一个实现通用功能的类,然后按钮从项目和通用类继承:

from PyQt5 import QtCore, QtWidgets


class Foo:
    def contextMenuEvent(self, event):
        print("contextMenuEvent")

    def custom_method_A(self):
        print("custom_method_A")

    def custom_method_B(self):
        print("custom_method_B")


class MyRectButton(QtWidgets.QGraphicsRectItem, Foo):
    pass


class MyEllipseButton(QtWidgets.QGraphicsEllipseItem, Foo):
    pass


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    scene = QtWidgets.QGraphicsScene()
    view = QtWidgets.QGraphicsView(scene)

    it_rect = MyRectButton(QtCore.QRectF(-50, -30, 100, 100))
    it_ellipse = MyEllipseButton(QtCore.QRectF(50, 50, 100, 100))

    scene.addItem(it_rect)
    scene.addItem(it_ellipse)

    for it in (it_rect, it_ellipse):
        it.custom_method_A()
        it.custom_method_B()

    view.resize(640, 480)
    view.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于如何在一个类中继承 QGraphicsRectItem 和 QGraphicsEllipseItem?的主要内容,如果未能解决你的问题,请参考以下文章

当子类和超类在不同的包中时,如何在java中继承一个类

为啥我不能在 C# 中继承一个类? [复制]

在 C++ 中继承同一个类两次(故意)

为啥在 Qt 中继承 QWidget 类时出现内存泄漏

在 Mixin 中继承父类属性

java中继承的好处是啥,在组合和继承中该如何取舍?