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中pygame模块用法实例
Oct 09 Python
在Python中使用列表生成式的教程
Apr 27 Python
进一步探究Python中的正则表达式
Apr 28 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
学生信息管理系统Python面向对象版
Jan 30 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
Python面向对象封装操作案例详解
Dec 31 Python
python序列类型种类详解
Feb 26 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Python实现aes加密解密多种方法解析
May 15 Python
python 6行代码制作月历生成器
Sep 18 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
JS中的phototype详解
2017/02/04 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
element-ui点击查看大图的方法示例
2020/12/14 Javascript
Python中下划线的使用方法
2015/03/27 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python编程中类与类的关系详解
2019/08/08 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
Java语言的优势
2015/01/10 面试题
财务学生的职业生涯发展
2014/02/11 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
初中家长评语和期望
2014/12/26 职场文书
英文慰问信范文
2015/03/24 职场文书
求职导师推荐信范文
2015/03/27 职场文书
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL