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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
python机器学习之神经网络实现
Oct 13 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
python实现人脸签到系统
Apr 13 Python
如何真正的了解python装饰器
Aug 14 Python
python 用struct模块解决黏包问题
Nov 07 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
用Python将库打包发布到pypi
Apr 13 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设计聊天室步步通
2006/10/09 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
劣质的PHP代码简化
2010/02/08 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
PHP重载基础知识回顾
2020/09/10 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
js+css实现打字效果
2020/06/24 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
python 上下文管理器使用方法小结
2017/10/10 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
Python实现分段线性插值
2018/12/17 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
什么是GWT的Module
2013/01/20 面试题
医学生求职自荐书
2014/06/12 职场文书
运动会标语
2014/06/21 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS