使用PyQt5实现图片查看器的示例代码


Posted in Python onApril 21, 2020

一、前言

在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片、拖动图片、放大和缩小图片。

最终实现的图片查看器你效果如下:

使用PyQt5实现图片查看器的示例代码

二、主要步骤

 1.显示图片

PyQt5 绘图系统能渲染矢量图像、位图图像和轮廓字体文本。一般会使用在修改或者提高现有组件的功能,或者创建自己的组件,使用 PyQt5 的绘图 API 进行操作。在 Qt 中有 QPainter 类用于执行绘制的操作,绘图由 paintEvent() 来完成,绘图的代码要放在 QPainter 对象的 start() 和 end() 方法之间。

要将图片显示出来,首先是继承 QWidget,然后实现 paintEvent() 方法,主要是使用 drawPixmap() 方法,需要传入 QPixmap 对象并将其绘制出来,绘图的代码如下:

def paintEvent(self, e):
   """
   receive paint events
   :param e: QPaintEvent
   :return:
   """
   if self.scaled_img:
     painter = QPainter()
     painter.begin(self)
     painter.drawPixmap(self.point, self.scaled_img)
    painter.end()

2.拖动图片

在图片成功显示出来之后,需要能够去拖动图片,以便于查看图片的每个角落,主要得实现三个方法:mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent,分别对应移动鼠标、点击鼠标和松开鼠标三个事件。

思路是获取鼠标点击时的位置,然后根据鼠标位置的变化来计算图片需要移动的距离,再移动图片就行了。具体代码如下:

def mouseMoveEvent(self, e):
   """
   mouse move events for the widget
   :param e: QMouseEvent
   :return:
   """
   if self.left_click:
     self.end_pos = e.pos() - self.start_pos
     self.point = self.point + self.end_pos
     self.start_pos = e.pos()
     self.repaint()
 
 def mousePressEvent(self, e):
   """
   mouse press events for the widget
   :param e: QMouseEvent
   :return:
   """
   if e.button() == Qt.LeftButton:
     self.left_click = True
     self.start_pos = e.pos()
 
 def mouseReleaseEvent(self, e):
   """
   mouse release events for the widget
   :param e: QMouseEvent
   :return:
   """
   if e.button() == Qt.LeftButton:
     self.left_click = False

3.打开文件

有时候我们会想打开本地的文件进行查看,所以还要实现一个打开文件的功能。而要实现这一功能,可以用 QFileDialog 类来实现,该类里有一个 getOpenFileName() 方法,使用该方法能够打开本地路径并选择符合文件要求格式的文件,例如使用“*.png”就支持打开所有 png 格式的图片文件,而不支持其他格式的文件。

getOpenFileName() 方法有两个返回值,第一个返回值是所选择的文件的路径,第二个返回值是文件类型,得到文件路径后就能创建一个 QPixmap 对象,再使用前面显示图片的方法进行显示,具体代码如下:

def open_image(self):
  """
  select image file and open it
  :return:
  """
  img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File", "*.jpg;;*.png;;*.jpeg")
  self.box.set_image(img_name)

4.放大缩小图片

在查看图片的时候,有时候会需要放大了观看图片的某些细节部分,因而需要实现放大和缩小图片的功能,所以做了两个按钮分别用于放大图片和缩小图片。

在 QPainter 中,可以根据 QPainter 的坐标系进行各种变换,例如平移(translate)和变化(scale),这里就可以通过使用 scale() 方法实现放大和缩小图片。下面是两个按钮点击时触发的方法的具体代码:

def large_click(self):
   """
   used to enlarge image
   :return:
   """
   if self.box.scale < :
     self.box.scale += .
     self.box.adjustSize()
     self.update()
 
 def small_click(self):
   """
   used to reduce image
   :return:
   """
   if self.box.scale > .:
     self.box.scale -= .
     self.box.adjustSize()
     self.update()

完整代码已上传到 GitHub !

到此这篇关于使用PyQt5实现图片查看器的示例代码的文章就介绍到这了,更多相关PyQt5 图片查看器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python函数式编程指南(三):迭代器详解
Jun 24 Python
简单实现python进度条脚本
Dec 18 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
python批量复制图片到另一个文件夹
Sep 17 Python
Django框架封装外部函数示例
May 28 Python
使用python实现简单五子棋游戏
Jun 18 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
python随机模块random的22种函数(小结)
May 15 Python
jupyter notebook的安装与使用详解
May 18 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 #Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 #Python
Django基于客户端下载文件实现方法
Apr 21 #Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 #Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 #Python
jupyter notebook 的工作空间设置操作
Apr 20 #Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 #Python
You might like
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
js回调函数仿360开机
2019/12/26 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
abstract class和interface有什么区别?
2012/01/03 面试题
司机检讨书
2014/02/13 职场文书
承诺书模板
2014/08/30 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
老乡会致辞
2015/07/28 职场文书
python tkinter实现定时关机
2021/04/21 Python