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的Django框架下管理站点的基本方法
Jul 17 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Django的性能优化实现解析
Jul 30 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
Python容器类型公共方法总结
Aug 19 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+javascript制作带提示的验证码源码分享
2014/05/28 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
Python调用C语言程序方法解析
2020/07/07 Python
python的数学算法函数及公式用法
2020/11/18 Python
python 数据类型强制转换的总结
2021/01/25 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
销售工作岗位职责
2013/12/24 职场文书
公司成立感言
2014/01/11 职场文书
社区安全检查制度
2014/02/03 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
银行求职信怎么写
2014/05/26 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
青年教师个人总结
2015/02/11 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python