亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何顯示我在 PyQt5 中使用 QPainter 繪制的線條的預覽

如何顯示我在 PyQt5 中使用 QPainter 繪制的線條的預覽

子衿沉夜 2023-10-31 19:19:53
我的代碼是使用 mousePressEvent 和 mouseReleaseEvent 在 QImage 上繪制線條。它工作正常,但我希望在繪制所述線時(即在 MouseMoveEvent 上)出現一條動態預覽線?,F在,當我釋放鼠標左鍵時,這條線就會出現,但我看不到我正在繪制的內容。我希望在移動鼠標時顯示并更新線條的預覽,并且僅在釋放鼠標左鍵時“固定”。與 MS Paint Line 工具完全相同:https://youtu.be/YIw9ybdoM6o ?t=207這是我的代碼(它源自 Scribble 示例):from PyQt5.QtCore import QPoint, QRect, QSize, Qtfrom PyQt5.QtGui import QImage, QPainter, QPen, QColor, qRgbfrom PyQt5.QtWidgets import QApplication, QWidget, QMainWindowimport sysclass 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 = QPoint()    def mousePressEvent(self, event):        if event.button() == Qt.LeftButton:            self.startPoint = event.pos()            self.scribbling = True    def mouseReleaseEvent(self, event):        if event.button() == Qt.LeftButton and self.scribbling:            self.drawLineTo(event.pos())            self.scribbling = False    def paintEvent(self, event):        painter = QPainter(self)        dirtyRect = event.rect()        painter.drawImage(dirtyRect, self.image, dirtyRect)    def resizeEvent(self, event):        if self.width() > self.image.width() or self.height() > self.image.height():            newWidth = max(self.width() + 128, self.image.width())            newHeight = max(self.height() + 128, self.image.height())            self.resizeImage(self.image, QSize(newWidth, newHeight))            self.update()        super(DrawingArea, self).resizeEvent(event)我不知道如何顯示我正在繪制的線條的預覽,而且我還沒有找到合適的答案。我該怎么做呢?
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

您可以在方法內繪制線條,paintEvent()而不是直接在圖像上繪制,然后在實際釋放鼠標時在圖像上繪制。


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

請注意,您不需要update()在調整大小事件中調用,因為它是自動調用的。


我還刪除了不必要的更新矩形調用,因為在這種情況下它幾乎沒有用:指定一個應該發生更新的矩形通常是在繪制非常復雜的小部件時完成的(特別是當執行大量計算以正確繪制所有內容并且僅繪制一個小部件的一小部分實際上需要更新)。在您的情況下,計算實際更新矩形幾乎比繪制小部件的所有內容更耗時。


查看完整回答
反對 回復 2023-10-31
?
米脂

TA貢獻1836條經驗 獲得超3個贊

例如,它展示了如何實現一個自定義類,它實際上為您提供了一個“繪圖板”:

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

您可以在任何需要的地方使用這個 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()

希望這能有所幫助!快樂編碼!:)


查看完整回答
反對 回復 2023-10-31
  • 2 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號