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获取GY-85九轴模块信息示例
Dec 05 Python
用Python编写web API的教程
Apr 30 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
python实现计算器简易版
Dec 17 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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
PHP利用str_replace防注入的方法
2013/11/10 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
javascript 精粹笔记
2010/05/09 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
js对象基础实例分析
2015/01/13 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
专升本自我鉴定
2013/10/10 职场文书
门卫工作岗位职责
2013/12/17 职场文书
物流创业计划书
2014/02/01 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
高三励志标语
2014/06/05 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
用JS写一个发布订阅模式
2021/11/07 Javascript