You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.9 KiB

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 # 画板不再为空