使用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写xml文件的操作实例
Oct 05 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
python去除字符串中的换行符
Oct 11 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
Python datetime模块使用方法小结
Jun 18 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python实现京东抢秒杀功能
Jan 25 Python
Python实现天气查询软件
Jun 07 Python
Django REST framework 限流功能的使用
Jun 24 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
第四节--构造函数和析构函数
2006/11/16 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python del()函数用法
2013/03/24 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
原料仓仓管员岗位职责
2014/07/08 职场文书
通信工程求职信
2014/07/16 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
青涩记忆观后感
2015/06/18 职场文书
教师节班会主持词
2015/07/06 职场文书
计算机教师工作总结
2015/08/13 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python