使用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语言实现机器学习的K-近邻算法
Jun 11 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
python常用排序算法的实现代码
Nov 08 Python
python 字典访问的三种方法小结
Dec 05 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
python爬虫之爬取笔趣阁小说
Apr 22 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
js数组的操作指南
2014/12/28 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏