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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
wxPython中listbox用法实例详解
Jun 01 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python实现爬取百度图片的方法示例
Jul 06 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
django项目中新增app的2种实现方法
Apr 01 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
python 实现图片特效处理
Apr 03 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
咖啡与牛奶
2021/03/03 冲泡冲煮
PHP也可以?成Shell Script
2006/10/09 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
2012/09/19 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
生物科学系大学生的自我评价
2013/12/20 职场文书
自我评价范文分享
2014/01/04 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
圆明园观后感
2015/06/03 职场文书
贷款担保书范本
2015/09/22 职场文书
电力培训学习心得体会
2016/01/11 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python