使用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 17 Python
python实现自动登录人人网并采集信息的方法
Jun 28 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
python+pandas分析nginx日志的实例
Apr 28 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
Python中使用gflags实例及原理解析
Dec 13 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python中@contextmanager实例用法
Feb 07 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计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
淘宝搜索框效果实现分析
2011/03/05 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python删除文件示例分享
2014/01/28 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
Python读大数据txt
2016/03/28 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
pandas的resample重采样的使用
2020/04/24 Python
python可迭代对象去重实例
2020/05/15 Python
平面设计自荐信
2013/10/07 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
铁人观后感
2015/06/16 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
Oracle用户管理及赋权
2022/04/24 Oracle
cypress测试本地web应用
2022/06/01 Javascript