pyqt5画线如何动态显示效果

下面的代码可以工作

-- coding: utf-8 --

"""

【简介】
使用paintEvent在窗口实现划线例子

"""

import sys
from PyQt5.QtWidgets import QApplication ,QWidget
from PyQt5.QtGui import QPainter ,QPixmap,QPen
from PyQt5.QtCore import Qt , QPoint

class Winform(QWidget):

def __init__(self,parent=None):
    super(Winform,self).__init__(parent)
    self.setWindowTitle("绘图例子") 
    self.pix =  QPixmap()  # 实例化一个 QPixmap 对象
    self.lastPoint =  QPoint() # 起始点
    self.endPoint =  QPoint() #终点
    self.initUi()
    self.bline=0
    
def initUi(self):
    #窗口大小设置为600*500
    self.resize(600, 500)  
    # 画布大小为400*400,背景为白色
    self.pix = QPixmap(400, 400)
    self.pix.fill(Qt.white)

# 重绘的复写函数 主要在这里绘制
def paintEvent(self, event):
    pp = QPainter(self.pix)

    pen = QPen() # 定义笔格式对象
    pen.setWidth(10)  # 设置笔的宽度
    pp.setPen(pen) #将笔格式赋值给 画笔

    # 根据鼠标指针前后两个位置绘制直线
    pp.drawLine(self.lastPoint, self.endPoint)
    # 让前一个坐标值等于后一个坐标值,
    # 这样就能实现画出连续的线
    #self.lastPoint = self.endPoint
    painter = QPainter(self)
    painter.drawPixmap(0, 0, self.pix)  # 在画布上画出

'''
#鼠标按压事件
def mousePressEvent(self, event) :   
    # 鼠标左键按下  
    if event.button() == Qt.LeftButton :
        self.lastPoint = event.pos()
        self.endPoint = self.lastPoint
'''

'''
# 鼠标移动事件
def mouseMoveEvent(self, event):    
    # 鼠标左键按下的同时移动鼠标
    if event.buttons() and Qt.LeftButton :
        self.endPoint = event.pos()
        #进行重新绘制
        self.update()
'''

# 鼠标释放事件
def mouseReleaseEvent( self, event):
    # 鼠标左键释放   
    if event.button() == Qt.LeftButton :
        '''
        self.endPoint = event.pos()
        #进行重新绘制
        self.update()
        '''
        if self.bline==0:
            self.lastPoint = event.pos()
            self.bline=1
        else:
            self.endPoint = event.pos()
            self.bline=0
            #进行重新绘制
            self.update()
        

if name == "__main__":

app = QApplication(sys.argv) 
form = Winform()
form.show()
sys.exit(app.exec_())
    

下面的代码没有达到我想要的效果,希望鼠标移动时临时显示画线

-- coding: utf-8 --

"""

【简介】
使用paintEvent在窗口实现划线例子

"""

import sys
from PyQt5.QtWidgets import QApplication ,QWidget
from PyQt5.QtGui import QPainter ,QPixmap,QPen
from PyQt5.QtCore import Qt , QPoint

class Winform(QWidget):

def __init__(self,parent=None):
    super(Winform,self).__init__(parent)
    self.setWindowTitle("绘图例子") 
    self.pix =  QPixmap()  # 实例化一个 QPixmap 对象
    self.pix2 =  QPixmap()  # 实例化一个 QPixmap 对象
    self.lastPoint =  QPoint() # 起始点
    self.endPoint =  QPoint() #终点
    self.endPoint2 =  QPoint() #终点
    self.initUi()
    self.bline=0
    
def initUi(self):
    #窗口大小设置为600*500
    self.resize(600, 500)  
    # 画布大小为400*400,背景为白色
    self.pix = QPixmap(400, 400)
    self.pix.fill(Qt.white)

# 重绘的复写函数 主要在这里绘制
def paintEvent(self, event):
    if self.bline:
        pp = QPainter(self.pix2)
       
        pen = QPen() # 定义笔格式对象
        pen.setWidth(3)  # 设置笔的宽度
        #pen.setColor(Red)  # 设置笔
        pp.setPen(pen) #将笔格式赋值给 画笔
       
        # 根据鼠标指针前后两个位置绘制直线
        pp.drawLine(self.lastPoint, self.endPoint2)
        # 让前一个坐标值等于后一个坐标值,
        # 这样就能实现画出连续的线
        #self.lastPoint = self.endPoint
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix2)  # 在画布上画出
    else:
        pp = QPainter(self.pix)
       
        pen = QPen() # 定义笔格式对象
        pen.setWidth(3)  # 设置笔的宽度
        pp.setPen(pen) #将笔格式赋值给 画笔
       
        # 根据鼠标指针前后两个位置绘制直线
        pp.drawLine(self.lastPoint, self.endPoint)
        # 让前一个坐标值等于后一个坐标值,
        # 这样就能实现画出连续的线
        #self.lastPoint = self.endPoint
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix)  # 在画布上画出

'''
#鼠标按压事件
def mousePressEvent(self, event) :   
    # 鼠标左键按下  
    if event.button() == Qt.LeftButton :
        self.lastPoint = event.pos()
        self.endPoint = self.lastPoint
'''

# 鼠标移动事件
def mouseMoveEvent(self, event):    
    if self.bline :
        self.endPoint2 = event.pos()
        #进行重新绘制
        self.update()
    '''
    # 鼠标左键按下的同时移动鼠标
    if event.buttons() and Qt.LeftButton :
        self.endPoint = event.pos()
        #进行重新绘制
        self.update()
'''

# 鼠标释放事件
def mouseReleaseEvent( self, event):
    # 鼠标左键释放   
    if event.button() == Qt.LeftButton :
        '''
        self.endPoint = event.pos()
        #进行重新绘制
        self.update()
        '''
        if self.bline==0:
            self.lastPoint = event.pos()
            self.bline=1
        else:
            self.endPoint = event.pos()
            self.bline=0
            #进行重新绘制
            self.update()
        

if name == "__main__":

app = QApplication(sys.argv) 
form = Winform()
form.show()
sys.exit(app.exec_())
    
阅读 2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题