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中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
Python3实现购物车功能
Apr 18 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
Python缓存技术实现过程详解
Sep 25 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
python简单验证码识别的实现过程
Jun 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新手上路(六)
2006/10/09 PHP
PHP 变量类型的强制转换
2009/10/23 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
深入了解Python中pop和remove的使用方法
2018/01/09 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python实现类之间的方法互相调用
2018/04/29 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015年工会工作总结
2015/03/30 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python