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复制文件代码实现
Dec 23 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
python语言使用技巧分享
May 31 Python
Python如何快速实现分布式任务
Jul 06 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
python3正则提取字符串里的中文实例
Jan 31 Python
Python使用configparser库读取配置文件
Feb 22 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
在Django中使用MQTT的方法
May 10 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/16 星际争霸
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
自己实现ajax封装示例分享
2014/04/01 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
从0开始的Python学习016异常
2019/04/08 Python
python爬虫 正则表达式解析
2019/09/28 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
python如何求100以内的素数
2020/05/27 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
python 实现简易的记事本
2020/11/30 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
一份婚庆公司创业计划书
2014/01/11 职场文书
工地安全质量标语
2014/06/07 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
小学科学教学计划
2015/01/21 职场文书
史上最牛辞职信
2015/05/13 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python