PyQt5自定义Drawer类绘图后保存图片为空,求助原因
解决PyQt5自定义绘图保存图片为空的问题
我帮你分析下问题的核心:你目前的绘图逻辑是把所有线条都画在临时的QPainterPath里,只在控件的paintEvent中临时渲染到界面上,但从来没有把这些绘制内容真正写入到用来保存的self.image对象里。你的self.image自初始化后就只有白色背景,所以调用saveImage时自然导出的是空图片。
要解决这个问题,我们需要把绘制的路径内容固化到self.image中,下面是具体的修改方案:
1. 补充鼠标释放事件,将路径写入图片
在你的Drawer类里添加mouseReleaseEvent方法,当用户松开鼠标完成一段绘制时,把当前的路径绘制到self.image上:
def mouseReleaseEvent(self, event): # 创建针对self.image的绘图对象 painter = QPainter(self.image) painter.setPen(QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) # 将当前路径绘制到image中 painter.drawPath(self.path) painter.end() self.modified = True # 清空路径,准备下一段绘制 self.path = QPainterPath() self.update()
2. 调整paintEvent逻辑,兼顾临时路径与已保存内容
修改paintEvent,让它既显示已经写入self.image的内容,又能实时显示当前正在拖动的未完成路径:
def paintEvent(self, event): painter = QPainter(self) # 先绘制已保存到image的内容 painter.drawImage(event.rect(), self.image) # 如果有未完成的绘制路径(鼠标拖动中),临时渲染出来 if not self.path.isEmpty(): painter.setPen(QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) painter.drawPath(self.path)
3. 验证保存逻辑
现在你的saveImage方法不需要修改,因为self.image已经包含了所有绘制的内容,调用self.image.save()就能正确导出带有绘图的图片了。
如果想要实现“拖动过程中就实时把路径写入image”的效果,也可以把绘制到image的逻辑放到mouseMoveEvent里,但这样每次拖动都会修改image,适合需要实时保存中间状态的场景。
内容的提问来源于stack exchange,提问作者ou2105
相关产品推荐
相关产品推荐

