Задайте размер растрового изображения, сохраните его как переменную-член, не делайте pass
в paintEvent
и сбросьте растровое изображение после рисования на нем.
(Осторожно, вы используете event.pos()
, что является позициейвнутри QLabel
, когда вы изменяете размеры QPixmap
и 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())