Не отображаются нарисованные фигуры Pyqt5. Метод клонирования

Плучил задание - создать графический редактор, где будут отображаться выбранные фигуры определённого размера и цвета, вноситься в список объектов, и столкнулся с данной проблемой. Фигуры создаются, но не отображаются на "холсте" Canvas(). Если отдельно виджет работал, то после встраивания его в MainWindow нет никаких изображений. Прошу указать где я допустил ошибку.

Ещё в задании нужно объявить метод клонирования объекта из listBox = QlistWidget() на холст в произвольном месте через itemDoubleClicked. Посоветуйте как реализовать : наткнулся на метод в самом QlistWidget - QlistWidget.item().clone(); так же есть метод deepcopy(). Заранее спасибо.

Сам код:

from abc import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtCore
from PyQt5 import QtGui
import copy

class Shape(ABC):
    shape = None
    name_shape = None
    name_color = None

    @abstractmethod
    def Draw_shape(self, begin, end, painter, name):
        self.name_shape = name

    @abstractmethod
    def Set_color(self, painter, color):
        painter.setBrush(color)

    @abstractmethod
    def Get_type(self, object):
        pass

    @abstractmethod
    def Clone(self, obj):
        return copy.deepcopy(obj)

class Square(Shape):
    def Draw_shape(self, begin, end, painter, name="Квадрат"):
        super(Square, self).Draw_shape(begin, end, painter, name="Квадрат")
        self.shape = QtCore.QRect(begin, end)
        painter.drawRect(self.shape)

    def Set_color(self, painter, color):
        super(Square, self).Set_color(painter, color)

    def Get_type(self, object):
        super(Square, self).Get_type(object)

    def Clone(self, obj):
        super(Square, self).Clone(obj)

class Ellipse(Shape):

    def Draw_shape(self, begin, end, painter, name="Круг"):
        super(Ellipse, self).Draw_shape(begin, end, painter, name="Круг")
        self.shape = QtCore.QRect(begin, end)
        painter.drawEllipse(self.shape)

    def Set_color(self, painter, color):
        super(Ellipse, self).Set_color(painter, color)

    def Get_type(self, object):
        super(Ellipse, self).Get_type(object)

    def Clone(self, obj):
        super(Ellipse, self).Clone(obj)

class Triangle(Shape):
    def Draw_shape(self, begin, end, painter, name="Треугольник"):
        super(Triangle, self).Draw_shape(begin, end, painter, name="Треугольник")
        widht = end.x()
        height = begin.y()
        self.shape = QtCore.QPointF(widht, height)
        painter.drawPolygon(begin, end, self.shape)

    def Set_color(self, painter, color):
        super(Triangle, self).Set_color(painter, color)

    def Get_type(self, object):
        super(Triangle, self).Get_type(object)

    def Clone(self, obj):
        super(Triangle, self).Clone(obj)

class Canvas(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(self.size())

        self.pix = QtGui.QPixmap(self.size())
        self.pix.fill(QtCore.Qt.white)

        self.painter = QtGui.QPainter(self)
        self.painter.drawPixmap(0, 0, self.pix)


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(700, 500)

        self.brush = QBrush(Qt.white)
        self.shape_list = []

        self.begin = QtCore.QPoint()
        self.end = QtCore.QPoint()

        menu_bar = QMenuBar(self)
        shape_menu = QMenu("Фигура", self)
        color_menu = QMenu("Цвет", self)
        menu_bar.addMenu(shape_menu)
        menu_bar.addMenu(color_menu)

        rect = QAction("Квадрат", self)
        circle = QAction("Круг", self)
        triangle = QAction("Треугольник", self)

        dark = QAction("Черный", self)
        blue = QAction("Синий", self)
        red = QAction("Красный", self)
        green = QAction("Зелёный", self)

        shape_menu.addAction(rect)
        shape_menu.addAction(circle)
        shape_menu.addAction(triangle)

        color_menu.addAction(dark)
        color_menu.addAction(blue)
        color_menu.addAction(red)
        color_menu.addAction(green)

        self.listBox = QListWidget()
        layout_ver = QVBoxLayout()
        layout_hor = QHBoxLayout()
        self.setLayout(layout_ver)

        rect.triggered.connect(self.Square)
        circle.triggered.connect(self.Circ)
        triangle.triggered.connect(self.Triang)

        dark.triggered.connect(self.Set_blak_color)
        blue.triggered.connect(self.Set_blue_color)
        red.triggered.connect(self.Set_red_color)
        green.triggered.connect(self.Set_green_color)

        layout_ver.addSpacing(15)
        layout_ver.addWidget(self.listBox, 2)
        layout_ver.addLayout(layout_hor)

        self.canvas = Canvas()

        layout_ver.addWidget(self.canvas, 8)

        self.square = Square()
        self.ellipse = Ellipse()
        self.triangle = Triangle()

        self.type_of_shape = self.square
        self.type_of_shape.name_color = "Белый"

        self.show()

    def Set_red_color(self):
        self.brush = QBrush(Qt.red)
        self.type_of_shape.name_color = "Красный"

    def Set_green_color(self):
        self.brush = QBrush(Qt.green)
        self.type_of_shape.name_color = "Зелёный"

    def Set_blak_color(self):
        self.brush = QBrush(Qt.black)
        self.type_of_shape.name_color = "Чёрный"

    def Set_blue_color(self):
        self.brush = QBrush(Qt.blue)
        self.type_of_shape.name_color = "Синий"

    def Square(self):
        self.type_of_shape = self.square
        self.type_of_shape.name_shape = "Квадрат"

    def Circ(self):
        self.type_of_shape = self.ellipse
        self.type_of_shape.name_shape = "Круг"

    def Triang(self):
        self.type_of_shape = self.triangle
        self.type_of_shape.name_shape = "Треугольник"

    def paintEvent(self, event):
        self.canvas.painter.drawPixmap(0, 0, self.canvas.pix)
        self.type_of_shape.Set_color(self.canvas.painter, self.brush)
        self.type_of_shape.Draw_shape(self.begin, self.end, self.canvas.painter)


    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.begin = event.pos()
            self.end = self.begin
            self.update()

    def mouseMoveEvent(self, event):
        if event.buttons() == QtCore.Qt.LeftButton:
            self.end = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print(self.type_of_shape.shape)

            self.listBox.addItem(f"{self.type_of_shape.shape}, {self.type_of_shape.name_color} {self.type_of_shape.name_shape} ")
            self.type_of_shape.Set_color(self.canvas.painter, self.brush)
            self.type_of_shape.Draw_shape(self.begin, self.end, self.canvas.painter)

            self.begin = self.end = QtCore.QPoint()
            self.update()

app = QApplication(sys.argv)
win = MainWindow()
sys.exit(app.exec_())

Ответы (0 шт):