diff --git a/PaintBoard.py b/PaintBoard.py new file mode 100644 index 0000000..5522dac --- /dev/null +++ b/PaintBoard.py @@ -0,0 +1,134 @@ +from PyQt5.QtWidgets import QWidget +from PyQt5.Qt import QPixmap, QPainter, QPoint, QPen, QColor, QSize +from PyQt5.QtCore import Qt + + +class PaintBoard(QWidget): + def __init__(self, Parent=None): + super().__init__(Parent) + + # 先初始化数据,再初始化界面 + self.__InitData() + self.__InitView() + + + def __InitData(self): + # 画板尺寸 + self.__size = QSize(560, 560) + + # 新建QPixmap作为画板,尺寸为__size + self.__board = QPixmap(self.__size) + + # 画板背景填充色(默认为白色) + self.__board.fill(Qt.white) + + # 画板内容(默认为空) + self.__IsEmpty = True + + # 橡皮擦模式(默认关闭) + self.EraserMode = False + + # 上一次鼠标位置 + self.__lastPos = QPoint(0, 0) + + # 当前的鼠标位置 + self.__currentPos = QPoint(0, 0) + + # 新建绘图工具 + self.__painter = QPainter() + + # 画笔粗细(默认为 8) + self.__thickness = 20 + + # 画笔颜色(默认为黑色) + self.__penColor = QColor("black") + + # 获取颜色列表 + self.__colorList = QColor.colorNames() + + + def __InitView(self): + # 设置界面的尺寸 + self.setFixedSize(self.__size) + + + def Clear(self): + # 清空画板 + self.__board.fill(Qt.white) + self.update() + self.__IsEmpty = True + + + def ChangePenColor(self, color="black"): + # 改变画笔颜色 + self.__penColor = QColor(color) + + + def ChangePenThickness(self, thickness=20): + # 改变画笔粗细 + self.__thickness = thickness + + + def IsEmpty(self): + # 返回画板是否为空 + return self.__IsEmpty + + + def SetContentFromQPixmap(self, pixmap): + # 设置画板内容为给定的QPixmap + if pixmap.size() != self.__size: + # 如果传入的pixmap尺寸与画板尺寸不一致,则调整其尺寸 + self.__board = pixmap.scaled(self.__size) + else: + self.__board = pixmap + self.__IsEmpty = False # 画板不再为空 + self.update() # 更新显示 + + + def GetContentAsQImage(self): + # 获取画板内容(返回QImage) + image = self.__board.toImage() + return image + + + def paintEvent(self, paintEvent): + # 绘图事件 + # 绘图时必须使用QPainter的实例,此处为__painter + # 绘图在begin()函数与end()函数间进行 + # begin(param)的参数要指定绘图设备,即把图画在哪里 + # drawPixmap用于绘制QPixmap类型的对象 + self.__painter.begin(self) + + # 0,0为绘图的左上角起点的坐标,__board即要绘制的图 + self.__painter.drawPixmap(0, 0, self.__board) + self.__painter.end() + + + def mousePressEvent(self, mouseEvent): + # 鼠标按下时,获取鼠标的当前位置保存为上一次位置 + self.__currentPos = mouseEvent.pos() + self.__lastPos = self.__currentPos + + + def mouseMoveEvent(self, mouseEvent): + # 鼠标移动时,更新当前位置,并在上一个位置和当前位置间画线 + self.__currentPos = mouseEvent.pos() + self.__painter.begin(self.__board) + + if self.EraserMode == False: + # 非橡皮擦模式 + self.__painter.setPen(QPen(self.__penColor, self.__thickness)) # 设置画笔颜色,粗细 + else: + # 橡皮擦模式下画笔为纯白色,粗细不变 + self.__painter.setPen(QPen(Qt.white, self.__thickness)) + + # 画线 + self.__painter.drawLine(self.__lastPos, self.__currentPos) + self.__painter.end() + self.__lastPos = self.__currentPos + + self.update() # 更新显示 + + + def mouseReleaseEvent(self, mouseEvent): + self.__IsEmpty = False # 画板不再为空