Как я могу создать подкласс QGraphicsRectItem и QGraphicsEllipseItem в одном классе? - PullRequest
1 голос
/ 26 февраля 2020

Я использую Pyside2 и у меня есть пользовательский интерфейс, который использует QGraphicsView и QGraphicsScene.

Сейчас у меня есть два отдельных класса, которые подклассов 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 Ответ

3 голосов
/ 26 февраля 2020

Вы можете создать класс, который реализует общую функциональность, а затем кнопки наследуются от элемента и общего класса:

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_())
...