使用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实现对比不同字体中的同一字符的显示效果
Apr 23 Python
python 编程之twisted详解及简单实例
Jan 28 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
快速排序的四种python实现(推荐)
Apr 03 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 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
Protoss兵种介绍
2020/03/14 星际争霸
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
微信小程序云开发详细教程
2019/05/16 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
Python合并多个装饰器小技巧
2015/04/28 Python
python图像处理之反色实现方法
2015/05/30 Python
详细介绍Python的鸭子类型
2016/09/12 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
pytorch 修改预训练model实例
2020/01/18 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
python opencv实现图像配准与比较
2021/02/09 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
初中学校对照检查材料
2014/08/19 职场文书
高三语文教学反思
2016/02/16 职场文书