如何使用QPainter+QPixmap实现鼠标绘图?

2024-04-18 13:14:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用鼠标画图。你知道吗

当我运行代码并尝试绘制时,在画布上看不到任何结果。怎么了?你知道吗

下面的代码只包含类画布代码,不包括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

Tags: 代码fromposimportselfnoneeventinit
1条回答
网友
1楼 · 发布于 2024-04-18 13:14:21

给pixmap一个大小,将其保存为成员变量,不要在paintEventpass并在绘制pixmap后重置它。你知道吗

(小心使用event.pos()这是QLabel内部的位置,当调整QPixmapQLabel大小时,它们不再相同,并且会得到偏移量。)

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())

相关问题 更多 >