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(),这个方法会在内部调用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_())

截图: