2 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以在方法內(nèi)繪制線條,paintEvent()而不是直接在圖像上繪制,然后在實(shí)際釋放鼠標(biāo)時(shí)在圖像上繪制。
class DrawingArea(QWidget):
def __init__(self, parent=None):
super(DrawingArea, self).__init__(parent)
self.setAttribute(Qt.WA_StaticContents)
self.scribbling = False
self.myPenWidth = 1
self.myPenColor = QColor('#000000')
self.image = QImage()
self.startPoint = self.endPoint = None
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.startPoint = event.pos()
def mouseMoveEvent(self, event):
if self.startPoint:
self.endPoint = event.pos()
self.update()
def mouseReleaseEvent(self, event):
if self.startPoint and self.endPoint:
self.updateImage()
def paintEvent(self, event):
painter = QPainter(self)
dirtyRect = event.rect()
painter.drawImage(dirtyRect, self.image, dirtyRect)
if self.startPoint and self.endPoint:
painter.drawLine(self.startPoint, self.endPoint)
def updateImage(self):
if self.startPoint and self.endPoint:
painter = QPainter(self.image)
painter.setPen(QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawLine(self.startPoint, self.endPoint)
painter.end()
self.startPoint = self.endPoint = None
self.update()
請(qǐng)注意,您不需要update()在調(diào)整大小事件中調(diào)用,因?yàn)樗亲詣?dòng)調(diào)用的。
我還刪除了不必要的更新矩形調(diào)用,因?yàn)樵谶@種情況下它幾乎沒有用:指定一個(gè)應(yīng)該發(fā)生更新的矩形通常是在繪制非常復(fù)雜的小部件時(shí)完成的(特別是當(dāng)執(zhí)行大量計(jì)算以正確繪制所有內(nèi)容并且僅繪制一個(gè)小部件的一小部分實(shí)際上需要更新)。在您的情況下,計(jì)算實(shí)際更新矩形幾乎比繪制小部件的所有內(nèi)容更耗時(shí)。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
例如,它展示了如何實(shí)現(xiàn)一個(gè)自定義類,它實(shí)際上為您提供了一個(gè)“繪圖板”:
class Canvas(QLabel):
? ? def __init__(self):
? ? ? ? super().__init__()
? ? ? ? pixmap = QtGui.QPixmap(600, 300)
? ? ? ? self.setPixmap(pixmap)
? ? ? ? self.last_x, self.last_y = None, None
? ? ? ? self.pen_color = QtGui.QColor('#000000')
? ? def set_pen_color(self, c):
? ? ? ? self.pen_color = QtGui.QColor(c)
? ? def mouseMoveEvent(self, e):
? ? ? ? if self.last_x is None:? # First event.
? ? ? ? ? ? self.last_x = e.x()
? ? ? ? ? ? self.last_y = e.y()
? ? ? ? ? ? return? # Ignore the first time.
? ? ? ? painter = QtGui.QPainter(self.pixmap())
? ? ? ? p = painter.pen()
? ? ? ? p.setWidth(1)
? ? ? ? p.setColor(self.pen_color)
? ? ? ? painter.setPen(p)
? ? ? ? painter.drawLine(self.last_x, self.last_y, e.x(), e.y())
? ? ? ? painter.end()
? ? ? ? self.update()
? ? ? ? # Update the origin for next time.
? ? ? ? self.last_x = e.x()
? ? ? ? self.last_y = e.y()
? ? def mouseReleaseEvent(self, e):
? ? ? ? self.last_x = None
? ? ? ? self.last_y = None
您可以在任何需要的地方使用這個(gè) Canvas 類(或者您給它起的任何名稱)。例如在主窗口中:
class MainWindow(QMainWindow):
? ? def __init__(self, parent=None):
? ? ? ? QMainWindow.__init__(self, parent)
? ? ? ? self.canvas = Canvas()
? ? ? ? self.canvas.set_pen_color('#fffee5')? # set the colour you want
? ? ? ? self.setCentralWidget(self.canvas)
? ? ? ? self.show()
希望這能有所幫助!快樂編碼!:)
添加回答
舉報(bào)