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 相关文章推荐
使用pdb模块调试Python程序实例
Jun 02 Python
python设计模式大全
Jun 27 Python
一份python入门应该看的学习资料
Apr 11 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
Python自定义一个异常类的方法
Jun 27 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
谈谈python垃圾回收机制
Sep 27 Python
python实现录制全屏和选择区域录屏功能
Feb 05 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
jQuery拖拽 & 弹出层 介绍与示例
2013/12/27 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
python抓取网页中图片并保存到本地
2015/12/01 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
pandas实现选取特定索引的行
2018/04/20 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
django 类视图的使用方法详解
2019/07/24 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
销售文员岗位职责
2013/11/29 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
一年级语文教学反思
2014/02/13 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技