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


Posted in Python onMarch 08, 2020

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

运行效果图如下

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

代码分析

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

第一组代码:初始化代码

        #实例化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 相关文章推荐
python连接mysql实例分享
Oct 09 Python
python并发编程之线程实例解析
Dec 27 Python
使用python和pygame绘制繁花曲线的方法
Feb 24 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
python开根号实例讲解
Aug 30 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python切片作为占位符使用实例讲解
Feb 17 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 #Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 #Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 #Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 #Python
python输出第n个默尼森数的实现示例
Mar 08 #Python
Tensorflow之梯度裁剪的实现示例
Mar 08 #Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 #Python
You might like
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python实现问号表达式(?)的方法
2013/11/27 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
名片管理系统python版
2018/01/11 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python django model联合主键的例子
2019/08/06 Python
Python: 传递列表副本方式
2019/12/19 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
大学生入党思想汇报
2014/01/14 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
教师个人发展总结
2015/02/11 职场文书
干部考核工作总结
2015/08/12 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
Mysql基础之常见函数
2021/04/22 MySQL