【问题标题】:How to implement drawing with mouse using QPainter + QPixmap?如何使用 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

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    给像素图一个大小,将其保存为成员变量,不要在paintEventpass 并在绘制后重置像素图。

    (当您调整QPixmapQLabel 的大小时,请注意您使用的是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!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多