【问题标题】:How can I subclass QGraphicsRectItem and QGraphicsEllipseItem in one class?如何在一个类中继承 QGraphicsRectItem 和 QGraphicsEllipseItem?
【发布时间】: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


【问题讨论】:

    标签: python pyside2 qgraphicsscene qgraphicsrectitem qgraphicsellipseitem


    【解决方案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_())
    

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多