如何使用 QPainter + QPixmap 实现鼠标绘图?
Posted
技术标签:
【中文标题】如何使用 QPainter + QPixmap 实现鼠标绘图?【英文标题】:How to implement drawing with mouse using QPainter + QPixmap? 【发布时间】:2019-01-28 19:58:27 【问题描述】:我正在尝试用鼠标实现绘图。
当我运行我的代码并尝试绘制时,我在画布上看不到任何结果。它有什么问题?
以下代码仅包含类 Canvas 代码,不包含我的项目中的 UI 和其他内容。
from PyQt5 import uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Canvas(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
p = self.palette()
p.setColor(self.backgroundRole(), Qt.white)
self.setAutoFillBackground(True)
self.setPalette(p)
self.setPixmap(QPixmap())
self.pen = QPen()
self.last = None
self.painter = QPainter(self.pixmap())
self.painter.begin(self)
def paintEvent(self, event):
pass
def mouseMoveEvent(self, event):
if self.last:
self.painter.setPen(self.pen)
self.painter.drawLine(self.last, event.pos())
self.last = event.pos()
self.update()
def mousePressEvent(self, event):
self.last = event.pos()
def mouseReleaseEvent(self, event):
self.last = None
【问题讨论】:
【参考方案1】:给像素图一个大小,将其保存为成员变量,不要在paintEvent
中pass
并在绘制后重置像素图。
(当您调整QPixmap
和QLabel
的大小时,请注意您使用的是event.pos()
,这是QLabel
内的位置,并且您会得到一个偏移量。)
from PyQt5 import uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Canvas(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
p = self.palette()
p.setColor(self.backgroundRole(), Qt.white)
self.setAutoFillBackground(True)
self.setPalette(p)
self.myPixmap = QPixmap(200,200)
self.setMinimumSize(200,200)
self.painter = QPainter(self.myPixmap)
self.pen = QPen(Qt.black)
self.painter.setPen(self.pen)
self.painter.fillRect(0,0,200,200, Qt.white)
self.setPixmap(self.myPixmap)
self.last = None
def mouseMoveEvent(self, event):
if self.last:
self.painter.drawLine(self.last, event.pos())
self.last = event.pos()
self.setPixmap(self.myPixmap)
self.update()
def mousePressEvent(self, event):
self.last = event.pos()
def mouseReleaseEvent(self, event):
self.last = None
def updateSize(self, width, height):
pm = QPixmap(width, height)
pm.fill(Qt.white)
old = self.myPixmap
self.myPixmap = pm
self.pen = QPen(Qt.black)
self.painter = QPainter(pm)
self.painter.drawPixmap(0,0,old)
self.setPixmap(pm)
def resizeEvent(self, event):
if event.oldSize().width() > 0:
self.updateSize(event.size().width(), event.size().height())
【讨论】:
嘿,谢谢,它有效!我想知道如何让这个 QPixmap 占用父小部件(QLabel)的所有可用空间? @BrainlessDuck 看到我的编辑。你必须在调整大小后调用函数updateSize
。您可以通过size 获取Canvas
当前大小。 (我也把setFixedSize
换成了setMinimumSize
!)以上是关于如何使用 QPainter + QPixmap 实现鼠标绘图?的主要内容,如果未能解决你的问题,请参考以下文章
Python Qt GUI设计:QPainterQPenQBrush和QPixmap窗口绘图类(基础篇—17)