簡體   English   中英

PyQt5:使用事件繪畫

[英]PyQt5: painting using events

我是PyQt的新手,我正在一個項目上,我應該在該項目上實現一項功能,使用戶能夠使用鼠標(數字識別系統)繪制數字。 所以我想要的是當按下鼠標按鈕時,應用程序將開始繪制,直到釋放按鈕為止。 我制作了此源代碼,但仍無法正常工作(我想我正在努力向PaintEvent()發送信號)。

import sys
from PyQt5 import QtCore 
from PyQt5 import QtGui, QtWidgets

from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog,QGraphicsView,QGraphicsScene,QVBoxLayout

from PyQt5.QtWidgets import (QApplication, QLabel, QWidget)
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication



class Communicate(QObject): 
    drawApp = pyqtSignal() 

class MyWidget(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI() 

    def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Simple')
        self.setMouseTracking(True)
        self.label = QLabel(self)
        self.label.resize(500, 40)
        self.c = Communicate()
        self.c.drawApp.connect(self.PaintEvent())  

        self.show()


    def mousePressEvent(self, event):

        self.c.drawApp.emit()
        self.startingposx = event.x()
        self.startingposy = event.y()
        #super().mousePressEvent(event)
        print ("mouse pressed")


    def mouseMoveEvent(self, event):

        self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()) )
        self.y = event.y()
        self.x=event.x()  


    def PaintEvent(self,event):

           qp = QPainter()  
           qp.begin(self)

           #qp.setPen(Qt.red)
           qp.drawPoints(self,qp)
           qp.end()

           self.update()



    def mouseReleaseEvent(self,event):
        self.endingposx = event.x()
        self.endingposy = event.y()
        super().mouseReleaseEvent(event)
        print("starting point was",self.startingposx)
        print("starting point y was ",self.startingposy)
        print("ending point was ",self.endingposx)
        print("ending point was y ",self.endingposy)
        print("released")    



    def drawPoints(self,qp):

          qp.setPen(Qt.red)
          size = self.size()
          x=self.x
          y=self.y
          qp.drawPoint(x,y)     

app = QApplication(sys.argv)


widget = MyWidget()

widget.show()

app.exec_()

Python對大小寫敏感,因此請多加注意,該方法稱為paintEvent

另外,您不應該直接調用paintEvent update() ,而必須使用函數update() ,此方法將在內部調用paintEvent()

但是,即使更正該錯誤也無法解決問題,如果要繪制路徑,建議使用QPainterPath來存儲筆畫。

class Drawer(QWidget):
    newPoint = pyqtSignal(QPoint)
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.path = QPainterPath()    

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPath(self.path)

    def mousePressEvent(self, event):
        self.path.moveTo(event.pos())
        self.update()

    def mouseMoveEvent(self, event):
        self.path.lineTo(event.pos())
        self.newPoint.emit(event.pos())
        self.update()

    def sizeHint(self):
        return QSize(400, 400)

class MyWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setLayout(QVBoxLayout())
        label = QLabel(self)
        drawer = Drawer(self)
        drawer.newPoint.connect(lambda p: label.setText('Coordinates: ( %d : %d )' % (p.x(), p.y())))
        self.layout().addWidget(label)
        self.layout().addWidget(drawer)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

截圖:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM