Пытаясь реализовать рисование, я решил начать с фигур Мой инициат:
def __init__(self, parent=None):
self.modified = False
self.rectangle = False
self.ellipse = False
self.begin = QPoint()
self.end = QPoint()
self.myPenWidth = 1
self.myFigureColor = Qt.black
self.image = QImage()
У меня есть событие, в котором есть функции для рисования фигур
def mousePressEvent(self, event):
if (event.button() == Qt.LeftButton) and self.rectangle:
self.draw_rectandle(event)
if (event.button() == Qt.LeftButton) and self.ellipse:
self.draw_ellipse(event)
Здесь мыиспользуйте функцию, в которой находится рисунок для рисунков: я выложу их ниже
def mouseMoveEvent(self, event):
if (event.buttons() & Qt.LeftButton) and self.rectangle:
self.end = event.pos()
self.update()
if (event.buttons() & Qt.LeftButton) and self.ellipse:
self.end = event.pos()
self.update()
и
def mouseReleaseEvent(self, event):
if (event.buttons() & Qt.LeftButton) and self.rectangle:
self.begin = event.pos()
self.end = event.pos()
if (event.buttons() & Qt.LeftButton) and self.ellipse:
self.begin = event.pos()
self.end = event.pos()
и еще одну функцию paintEvent:
def paintEvent(self, event):
painter = QPainter(self)
dirtyRect = event.rect()
painter.drawImage(dirtyRect, self.image, dirtyRect)
if self.rectangle == True:
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawRect(QRect(self.begin, self.end))
if self.ellipse == True:
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawEllipse(QRect(self.begin, self.end))
Функции самих фигур:
def draw_rectandle(self, event):
painter = QPainter(self.image)
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawRect(QRect(self.begin, self.end))
self.begin = event.pos()
self.end = event.pos()
self.modified = True
self.update()
def draw_ellipse(self, event):
painter = QPainter(self.image)
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawEllipse(QRect(self.begin, self.end))
self.begin = event.pos()
self.end = event.pos()
self.modified = True
self.update()
Также «псевдо-связывание»
def rectangleOn(self):
self.ellipse = False
self.rectangle = True
def ellipseOn(self):
self.rectangle = False
self.ellipse = True
Они используются для изменения флагов функций при нажатии кнопки формы.Сами кнопки выглядят так, если вам нужно:
Действия:
self.rectangle = QAction(QIcon('Image/rectangle.png'), 'Rectangle', self)
self.rectangle.triggered.connect(self.scribbleArea.rectangleOn)
self.ellipse = QAction(QIcon('Image/Ellipse.png'), 'Ellipse', self)
self.ellipse.triggered.connect(self.scribbleArea.ellipseOn)
Панель инструментов с кнопкой:
toolbar = self.addToolBar('Tools')
toolbar.addAction(self.rectangle)
toolbar.addAction(self.ellipse)
Я думаю, что функция не нужнаизменить цвет и размер.Поэтому пока я не буду публиковать.
Теперь я расскажу вам, в чем проблема.
В paintEvent у меня есть чертеж, показывающий форму.То есть мы вытягиваем край и видим, как меняется форма.Но тогда оттуда он никуда не сохраняется.
А в mousePressEvent уже рисует сам прямоугольник без этой анимации перетаскивания
Кажется, что все хорошо, но здесь есть ошибка
Как видите, рисунок прямоугольника переходит к mousePressEvent.А это значит, что прямоугольник появляется только тогда, когда я начинаю рисовать следующий.Это уже ошибка.НО!Если я нарисую несколько прямоугольников и начну рисовать эллипс, последний прямоугольник станет эллипсом.
А также с другими моими фигурами.
Если я начну рисовать линию, а затем переключусь наэллипс и начните рисовать эллипс в другом месте, линия, нарисованная мной, немедленно станет очень узким эллипсом.
Поэтому мне нужно как-то извлечь эту функцию из mousePressEvent, чтобы нарисовать желаемую фигуру,с таким переключением между инструментами.
Если вам нужно больше деталей, напишите с:
PS Прошу прощения за мой английский, если что-то не так с: