python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

 更新时间:2020年03月08日 14:55:30   作者:jia666666  
这篇文章主要介绍了python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析,需要的朋友可以参考下

在PyQt中常用的图像类有四种,QPixmap,QImage,QPicture,QBitmap

类型 描述
QPixmap 专门为绘图设计的,在绘制图片时需要使用QPixmap
QImage 提供了一个与硬件无关的图像表示函数,可以用于图片像素级访问
QPicture 是一个绘图设备类,它继承自QPainter类,可以使用QPainter的begin()函数在QPicture上绘图,使用end()函数结束绘图,使用QPicture的save()函数将QPainter所使用的绘图指令保存在文件中
QBitmap 是一个继承自QPixmap的简单类,它提供了1bit深度的二值图像的类,QBitmap提供的单色图像,可以用来制作游标(QCursor),或者笔刷(QBrush)

简单绘图板实例

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtCore import Qt, QPoint
class Winform(QWidget):
def __init__(self, parent=None):
super(Winform, self).__init__(parent)
#设置标题
self.setWindowTitle("绘图例子")
#实例化QPixmap类
self.pix = QPixmap()
#起点,终点
self.lastPoint = QPoint()
self.endPoint = QPoint()
#初始化
self.initUi()
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)
# 根据鼠标指针前后两个位置绘制直线
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 __name__ == "__main__":
app = QApplication(sys.argv)
form = Winform()
form.show()
sys.exit(app.exec_())

运行效果图如下

代码分析

在这个例子中,实现了简单的绘图功能,按住鼠标左键在画板上进行绘制,释放鼠标左键结束绘图

第一组代码:初始化代码

        #实例化QPixmap类

        self.pix = QPixmap()

        #起点,终点

        self.lastPoint = QPoint()

        self.endPoint = QPoint()

        #初始化

        self.initUi()

第二组代码:重构paintEvent()函数

        def paintEvent(self, event):

        pp = QPainter(self.pix)

        # 根据鼠标指针前后两个位置绘制直线

        pp.drawLine(self.lastPoint, self.endPoint)

        # 让前一个坐标值等于后一个坐标值,

        # 这样就能实现画出连续的线

        self.lastPoint = self.endPoint

        painter = QPainter(self)

        #绘制画布到窗口指定位置处

        painter.drawPixmap(0, 0, self.pix)

第三组代码:重构mousePressEvent()函数,使用两个点来绘制线条,这两个点从下面的鼠标事件中获取

 def mousePressEvent(self, event):

        # 鼠标左键按下

        if event.button() == Qt.LeftButton:

            self.lastPoint = event.pos()

            self.endPoint = self.lastPoint

第四组代码:重构mouseMoveEvent()函数,当鼠标左键把按下时获得开始点,每次绘制,都让结束点和开始点重合,这样确保这两个点的值都是预期值

    def mouseMoveEvent(self, event):

        # 鼠标左键按下的同时移动鼠标

        if event.buttons() and Qt.LeftButton:

            self.endPoint = event.pos()

            # 进行重新绘制

            self.update()

第五组代码:重构mouseReleaseEvent()函数,当鼠标指针移动时获得结束点,并更新绘制,注意,这里的button()函数可以获取在鼠标指针移动过程中按下的所有按键,然后用Qt.LeftButton来判断是否按下了左键,在mouseMoveEvent()中必须使用该函数来判断按下的鼠标按键,最后调用update()函数,会执行paintEvent()函数进行重新绘制

    def mouseReleaseEvent(self, event):

        # 鼠标左键释放

        if event.button() == Qt.LeftButton:

            self.endPoint = event.pos()

            # 进行重新绘制

            self.update()

当释放鼠标时,也会进行绘制,现在运行程序,按下鼠标左键在白色画布上进行绘制,实现了简单的涂鸦板功能

本文介绍了PyQt5利用QPixmap,QImage,QPicture,QBitmap实现简单画板的实例,更多关于PyQt5图形图像知识请查看下面的相关链接

相关文章

  • Python绘制七彩花朵(用Turtle)

    Python绘制七彩花朵(用Turtle)

    这篇文章主要给大家介绍了关于Python使用Turtle绘制七彩花朵的相关资料,通过本文介绍的方法就算刚入门的朋友也可以很快的入手绘制出漂亮的七彩花朵,需要的朋友可以参考下
    2023-07-07
  • python实现AI聊天机器人详解流程

    python实现AI聊天机器人详解流程

    事情是这样的,最近认识的一位小姐姐有每天早晨看天气预报的习惯。在我看来,很多人起床第一件事情就是看微信消息,既然这样,我就勉为其难每天早晨给小姐姐发送一则天气预报吧
    2021-11-11
  • python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    这篇文章主要介绍了python使用xlrd实现检索excel中某列含有指定字符串记录的方法,涉及Python使用xlrd模块检索Excel的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • python接入支付宝的实例操作

    python接入支付宝的实例操作

    在本篇文章里小编给大家整理的是一篇关于python接入支付宝的实例操作内容,需要的朋友们可以学习下。
    2020-07-07
  • Python变量的定义和运算符的使用

    Python变量的定义和运算符的使用

    这篇文章主要介绍了Python变量的定义和运算符的使用,Python和C/Java不同,在定义变量的时候不需要显示的指定变量的类型,在赋值的时候自动就会确定类型,需要的朋友可以参考下
    2023-05-05
  • python数据分析之如何删除value=0的行

    python数据分析之如何删除value=0的行

    这篇文章主要给大家介绍了关于python数据分析之如何删除value=0的行的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友可以参考下
    2022-12-12
  • python实现批量修改文件名

    python实现批量修改文件名

    这篇文章主要为大家详细介绍了python实现批量修改文件名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Python入门教程(二十八)Python中的JSON

    Python入门教程(二十八)Python中的JSON

    这篇文章主要介绍了Python入门教程(二十八)Python中的JSON,JSON 是用 JavaScript 对象表示法(JavaScript object notation)编写的文本,接下来我们就来学习一下
    2023-04-04
  • 使用Python简单编写一个股票监控系统

    使用Python简单编写一个股票监控系统

    这篇文章主要为大家详细介绍了如何使用Python简单编写一个股票监控系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • python生成器表达式和列表解析

    python生成器表达式和列表解析

    最近在学习python的过程中,对列表解析及生成器表达式有点疑惑。从表面上看,两者很相似,只有一点不同:列表解析采用中括号[]来包含,生成器表达式采用小括号()来包含。本文我们就来详细看下python生成器表达式和列表解析
    2016-03-03

最新评论