使用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中将一个全部为int的list 转化为str的list方法
Apr 09 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
Python对象与引用的介绍
Jan 24 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
python中的协程深入理解
Jun 10 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
python nmap实现端口扫描器教程
May 28 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 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自定义分页类完整实例
2015/12/25 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Python实现字符串匹配算法代码示例
2017/12/05 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
附答案的Java面试题
2012/11/19 面试题
教育科学研究生自荐信
2013/10/09 职场文书
工程专业应届生求职信
2014/02/19 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2016年寒假生活小结
2015/10/10 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书