Не отображаются нарисованные фигуры 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_())