第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

子衿沉夜 2023-10-31 19:19:53
我的代碼是使用 mousePressEvent 和 mouseReleaseEvent 在 QImage 上繪制線條。它工作正常,但我希望在繪制所述線時(shí)(即在 MouseMoveEvent 上)出現(xiàn)一條動(dòng)態(tài)預(yù)覽線?,F(xiàn)在,當(dāng)我釋放鼠標(biāo)左鍵時(shí),這條線就會(huì)出現(xiàn),但我看不到我正在繪制的內(nèi)容。我希望在移動(dòng)鼠標(biāo)時(shí)顯示并更新線條的預(yù)覽,并且僅在釋放鼠標(biāo)左鍵時(shí)“固定”。與 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)我不知道如何顯示我正在繪制的線條的預(yù)覽,而且我還沒有找到合適的答案。我該怎么做呢?
查看完整描述

2 回答

?
ibeautiful

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í)。


查看完整回答
反對(duì) 回復(fù) 2023-10-31
?
米脂

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

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


查看完整回答
反對(duì) 回復(fù) 2023-10-31
  • 2 回答
  • 0 關(guān)注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)