Но в реализации я столкнулся с вещью, которая мне не была понятна.
Рабочий карандашный код реализации:
import sys
from PyQt5.QtCore import QPoint, QRect, QSize, Qt
from PyQt5.QtGui import QPainter, QPen, QIcon, QPixmap, QColor
from PyQt5.QtWidgets import (QAction, QApplication, QMainWindow,QWidget)
class AbstractScribbleArea(QWidget):
def __init__(self, parent=None):
super(AbstractScribbleArea, self).__init__(parent)
self.modified = False
self._begin = QPoint()
self._end = QPoint()
self._lastPoint = QPoint()
self._pixmap = QPixmap()
self._shape = ""
self.myPenWidth = 10
self.myPenColor = QColor("black")
def mousePressEvent(self, event):
if event.buttons() & Qt.LeftButton:
self._begin = event.pos()
self._end = event.pos()
self.update()
super(AbstractScribbleArea, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() & Qt.LeftButton:
self._end = event.pos()
self.update()
super(AbstractScribbleArea, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
# draw on image
painter = QPainter(self._pixmap)
if self._shape == 'pencil':
painter.setPen(QPen(self.myPenColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
self.draw(painter, self._begin, self._end, True)
self._begin = QPoint()
self._end = QPoint()
self.update()
super(AbstractScribbleArea, self).mouseReleaseEvent(event)
def paintEvent(self, event):
painter = QPainter(self)
painter.drawPixmap(self.rect(), self._pixmap, self.rect())
if self._shape == 'pencil':
painter.setPen(QPen(self.myPenColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
self.draw(painter, self._begin, self._end, False)
def resizeEvent(self, event):
w = self.width() if self.width() > self._pixmap.width() else self._pixmap.width()
h = self.height() if self.height() > self._pixmap.height() else self._pixmap.height()
s = QSize(w, h)
if s != self._pixmap.size():
pixmap = QPixmap(self._pixmap)
self._pixmap = QPixmap(s)
painter = QPainter(self._pixmap)
painter.fillRect(QRect(0, 0, w, h), Qt.white)
painter.drawPixmap(pixmap.rect(), pixmap)
super(AbstractScribbleArea, self).resizeEvent(event)
def draw(self, painter, _begin, _end, is_released):
raise NotImplementedError
def sizeHint(self):
return QSize(640, 480)
def set_shape(self, shape):
self._shape = shape
def shape(self):
return self._shape
class ScribbleArea(AbstractScribbleArea):
def draw(self, painter, _begin, _end, is_released):
if _begin.isNull() or _end.isNull():
return
elif self.shape() == "pencil":
self.drawPencil(painter, _begin, _end)
def drawPencil(self, painter, _begin, _end):
self.modified = True
painter.drawPoint(_begin.x(), _end.y())
def pencilOn(self):
self.set_shape("pencil")
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.scribbleArea = ScribbleArea()
self.setCentralWidget(self.scribbleArea)
self.pen = QAction(QIcon('Image/pen.png'), 'Карандаш', self)
self.pen.triggered.connect(self.scribbleArea.pencilOn)
toolbar = self.addToolBar('Инструменты')
toolbar.addAction(self.pen)
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Проблема в том, что в данный момент точканарисовано, что можно перемещать вдоль оси.Но это не то, чего я жду.Я предполагаю, что вместо _begin.x (), _end.y () нужно использовать event.x (), event.y ().
Но это не сработает, потому что в функции рисования я не могупередать аргумент в «событие».
Когда я пытаюсь сделать что-то подобное, функция запрашивает событие с =
def draw(self, painter, _begin, _end, is_released):
if _begin.isNull() or _end.isNull():
return
elif self.shape() == "pencil":
self.drawPencil(painter, event= #????)
def drawPencil(self, painter, _begin, _end):
self.modified = True
painter.drawPoint(event.x(), event.y())
Я не совсем понимаю, что нужно передать событиютак что функция работает.
Существует еще одна реализация функции карандаша:
def draw_pencil(self, event):
painter.drawLine(self.lastPoint, event.pos())
self.modified = True
self._lastPoint = event.pos()
self.update()