使用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写的一个简单DNS服务器实例
Jun 04 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
TensorFlow如何实现反向传播
Feb 06 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 26 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
python计算导数并绘图的实例
Feb 29 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
python运行脚本文件的三种方法实例
Jun 25 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
jqgrid 简单学习笔记
2011/05/03 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
jstree的简单实例
2016/12/01 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Python如何调用外部系统命令
2019/08/07 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
工伤事故处理协议书怎么写
2014/10/15 职场文书
公司保洁员管理制度
2015/08/04 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis