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之玩转字符串(2)
Sep 14 Python
python WindowsError的错误代码详解
Jul 23 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
详解python while 函数及while和for的区别
Sep 07 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
详解Python 循环嵌套
Jul 09 Python
Django实现随机图形验证码的示例
Oct 15 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 Python
python内置进制转换函数的操作
Jun 02 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP 实例化类的一点摘记
2008/03/23 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
Dojo 学习要点
2010/09/03 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
jstree的简单实例
2016/12/01 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
详解python时间模块中的datetime模块
2016/01/13 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Python3标准库总结
2019/02/19 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
平民服装店创业计划书
2014/01/17 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
应届生求职信范文
2014/05/26 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技