使用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实现的一个p2p文件传输实例
Jun 04 Python
python Pygame的具体使用讲解
Nov 03 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
想学python 这5本书籍你必看!
Dec 11 Python
基于Python实现用户管理系统
Feb 26 Python
PyQt5 多窗口连接实例
Jun 19 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python打印异常信息的两种实现方式
Dec 24 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
详解Django的MVT设计模式
Apr 29 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实现文件编码批量转换
2014/03/10 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Django中的文件的上传的几种方式
2018/07/23 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
Python 获取div标签中的文字实例
2018/12/20 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
药学专业毕业生求职信
2013/10/20 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
辅导员评语
2014/05/04 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
淘宝好评语句大全
2014/12/31 职场文书
linux目录管理方法介绍
2022/06/01 Servers