【问题标题】:PyQt5: painting using eventsPyQt5:使用事件绘画
【发布时间】:2018-03-19 21:51:08
【问题描述】:

我是 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 qt pyqt pyqt5 qpainter


    【解决方案1】:

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

    截图:

    【讨论】:

    • eyllanesc 请教如何设置我尝试过的 QPainting 对象的背景:但它不起作用 def paintEvent(self, event):painter = QPainter(self)painter.setPen(QColor(168, 34, 3))painter.setFont(QFont('Decorative', 10)) bbrush = QtGui.QBrush(QtGui.QColor(0,0,0), QtCore.Qt.SolidPattern)painter.setBackground(painter,bbrush)painter .drawPath(self.path)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多