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分析git log日志示例
Feb 27 Python
python求众数问题实例
Sep 26 Python
Python中的super()方法使用简介
Aug 14 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
python executemany的使用及注意事项
Mar 13 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
python3获取文件中url内容并下载代码实例
Dec 27 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
PHP SplObjectStorage使用实例
2015/05/12 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
JavaScript引用类型Array实例分析
2018/07/24 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python pandas常用函数详解
2018/02/07 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
教师的实习自我鉴定
2013/12/17 职场文书
社区中秋节活动方案
2014/01/29 职场文书
小学毕业寄语大全
2014/04/03 职场文书
驻村工作先进事迹
2014/08/14 职场文书
实习证明格式范文
2014/10/14 职场文书
教师党员自我评价范文
2015/03/04 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
Python 图片添加美颜效果
2022/04/28 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle