问题描述
我正在尝试编写一个简单的图像编辑器(如paint)。
我实现了画线的矩形和椭圆形。
我想要的是看到一个矩形的外观动画(一个预示?),就像在绘制形状时在油漆中一样,您可以看到它的实际外观而无需在画布上真正绘制。
这是该代码的简化版本
class Canvas(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.initLogic()
def initUI(self):
self.image = QImage(self.size(),QImage.Format_RGB32)
self.image.fill(Qt.white)
def initLogic(self):
self.brushSize = 1
self.brushStyle = Qt.solidLine
self.brushColor = QColor(0,0)
self.shapeMode = None
self.drawing = False
self.mousePointer = None
def mousepressEvent(self,event):
self.drawing = True
self.mousePointer = event.pos()
def mouseMoveEvent(self,event):
#if no pen mode set draw lines from event to event
if self.drawing:
painter = QPainter(self.image)
painter.setPen(QPen(self.brushColor,self.brushSize,self.brushStyle))
shape = None #i try later to assign the method Qpainter.draw<someShape> to this variable
# hoping it works like in tkinter.
if self.shapeMode == None:#free shape
painter.drawLine(self.mousePointer,event.pos())
self.mousePointer = event.pos()
else:
#prevIoUs x and prevIoUs y
ox,oy = self.mousePointer.x(),self.mousePointer.y()
#current x and current y
dx,dy = event.pos().x(),event.pos().y()
width,height = dx - ox,dy - oy
#self.shapeMode is a string corresponding to a QPainter method
#we get the corresponding method using getattr builtin function
drawMethod = getattr(painter,self.shapeMode)# = painter.someFunc this works fine
shape = drawMethod(ox,oy,width,height) #assigning the method call to a variable
self.update()
if shape != None:
painter.eraseRect(shape)
"""
if self.drawing and self.shapeMode == None:
painter = QPainter(self.image)
painter.setPen(QPen(self.brushColor,self.brushStyle))
painter.drawLine(self.mousePointer,event.pos())
self.mousePointer = event.pos()
self.update()"""
#otherwise if pen mode set draw shape at event then delete until release
def mouseReleaseEvent(self,event):
if self.shapeMode != None:
painter = QPainter(self.image)
painter.setPen(QPen(self.brushColor,self.brushStyle))
#prevIoUs x and prevIoUs y
ox,self.mousePointer.y()
#current x and current y
dx,event.pos().y()
width,dy - oy
#self.shapeMode is a string corresponding to a QPainter methid
#we get the corresponding method using getattr builtin function
drawMethod = getattr(painter,self.shapeMode)# = painter.someFunc
shape = drawMethod(ox,height)
self.update()
self.mousePointer = event.pos()
self.drawing = False
#Todo end registering the action
def paintEvent(self,event):
widgetPainter = QPainter(self)
widgetPainter.drawImage(self.rect(),self.image,self.rect())
只要我按住鼠标,画布就会一直绘制矩形,我要的是调整矩形的大小,并且只有在释放鼠标后才能最终绘制矩形。
解决方法
您可以通过利用将哪种绘画设备传递给QPainter来实现此目的。在mouseMoveEvent
期间,请参考所计算的点和大小,以便在paintEvent
中绘制主窗口小部件。这样,绘制的所有内容将仅持续到下一次更新。然后在mouseReleaseEvent
中,您可以在QImage上绘制以永久绘制矩形。
class Canvas(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.initLogic()
def initUI(self):
self.image = QImage(self.size(),QImage.Format_RGB32)
self.image.fill(Qt.white)
def initLogic(self):
self.brushSize = 1
self.brushStyle = Qt.SolidLine
self.brushColor = QColor(0,0)
self.shapeMode = 'drawRect'
self.temp_rect = QRect()
self.drawing = False
self.mousePointer = None
def mousePressEvent(self,event):
self.drawing = True
self.mousePointer = event.pos()
def mouseMoveEvent(self,event):
#if no pen mode set draw lines from event to event
if self.drawing:
painter = QPainter(self.image)
painter.setPen(QPen(self.brushColor,self.brushSize,self.brushStyle))
if self.shapeMode == None:#free shape
painter.drawLine(self.mousePointer,event.pos())
self.mousePointer = event.pos()
else:
#previous x and previous y
ox,oy = self.mousePointer.x(),self.mousePointer.y()
#current x and current y
dx,dy = event.pos().x(),event.pos().y()
width,height = dx - ox,dy - oy
self.temp_rect = QRect(ox,oy,width,height)
self.update()
def mouseReleaseEvent(self,event):
if self.shapeMode != None:
painter = QPainter(self.image)
painter.setPen(QPen(self.brushColor,self.brushStyle))
#self.shapeMode is a string corresponding to a QPainter methid
#we get the corresponding method using getattr builtin function
drawMethod = getattr(painter,self.shapeMode)# = painter.someFunc
drawMethod(self.temp_rect)
self.update()
self.mousePointer = event.pos()
self.drawing = False
#TODO end registering the action
def paintEvent(self,event):
widgetPainter = QPainter(self)
widgetPainter.drawImage(self.rect(),self.image,self.rect())
if self.drawing:
drawMethod = getattr(widgetPainter,self.shapeMode)
drawMethod(self.temp_rect)
结果: