使用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 相关文章推荐
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
Python深入06——python的内存管理详解
Dec 07 Python
老生常谈Python基础之字符编码
Jun 14 Python
浅析python协程相关概念
Jan 20 Python
Django如何配置mysql数据库
May 04 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
python自动化发送邮件实例讲解
Jan 04 Python
Python绘制数码晶体管日期
Feb 19 Python
教你利用python实现企业微信发送消息
May 23 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 文件上传功能实现代码
2009/06/24 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
Javascript中的数学函数
2007/04/04 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
Ajax基础知识详解
2017/02/17 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
Python获取央视节目单的实现代码
2015/07/25 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
python解包概念及实例
2021/02/17 Python
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
2014标准社保办理委托书
2014/10/06 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
格林童话读书笔记
2015/06/30 职场文书
2015年教师节广播稿
2015/08/19 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js
vue动态绑定style样式
2022/04/20 Vue.js