使用 PyQt5 实现图片查看器
一、前言
在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片、拖动图片、放大和缩小图片。
最终实现的图片查看器你效果如下:
二、主要步骤
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 < 2:
- self.box.scale += 0.1
- self.box.adjustSize()
- self.update()
- def small_click(self):
- """
- used to reduce image
- :return:
- """
- if self.box.scale > 0.1:
- self.box.scale -= 0.2
- self.box.adjustSize()
- self.update()
完整代码已上传到 GitHub!
使用 PyQt5 实现图片查看器的更多相关文章
- 如何在pyqt中使用 QGraphicsView 实现图片查看器
前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...
- wpf 仿QQ图片查看器
参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...
- 发布两款JQ小插件(图片查看器 + 分类选择器),开源
图片查看器,github地址:https://github.com/VaJoy/imgViewer 效果如下: 这款当初大概写了2小时,有点匆忙地赶出来的,使用的接口很简单: $.bindViewer ...
- wpf图片查看器,支持鼠标滚动缩放拖拽
最近项目需要,要用到一个图片查看器,类似于windows自带的图片查看器那样,鼠标滚动可以缩放,可以拖拽图片,于是就写了这个简单的图片查看器. 前台代码: <Window x:Class=&qu ...
- 用JQ仿造礼德财富网的图片查看器
现在就职于一家P2P平台,自然也会关注同行其它网站的前端技术,今天要仿造的是礼德内页的一个图片查看器效果.不过说白了,无论人人贷也好礼德财富也好,很多地方的前端都做的不尽如人意,比如忽略细节.缺乏交互 ...
- 基于jQuery的一个简单的图片查看器
项目中自己diy了一个图片查看器.因为初始代码不是自己的,只是在上面改了一下也没有弄的很漂亮.等以后有时间了在重写一下样式和封装,作为备用的只是积累吧.如果有童鞋有用到,完全可以在此基础上改,比较容易 ...
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView 两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...
- Window Phone 8 应用程序连接扩展图片中心,图片扩展,图片查看器
WMAppManifest.xml <?xml version="1.0" encoding="utf-8"?> <Deployment xm ...
- js手写图片查看器(图片的缩放、旋转、拖拽)
在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...
随机推荐
- Java与C语言的区别——含面向对象介绍
很多初学编程的小伙伴或者想要学习编程的小白弄不清C语言和Java的区别.本文就针对萌新们尽量用通俗的语言来介绍一下我所理解的编程语言界的两大巨头. 为什么说是两巨头,介绍之前我们先看一下某度搜索出来的 ...
- VMware安装Ubutun之SSH为何安装不上之谜
一把心酸泪,鼻涕泪两行.谁人解我苦中苦,原是SSH安装不上去. 多方找寻,想要寻求解答. 首先我想到一个办法,找到进程,并且狠狠的用RM把它移除掉. NO,这个方法最后竟然不行,文件删了,锁还是获取不 ...
- SpringBoot2 + Druid + Mybatis 多数据源动态配置
在大数据高并发的应用场景下,为了更快的响应用户请求,读写分离是比较常见的应对方案.读写分离会使用多数据源的使用.下面记录如何搭建SpringBoot2 + Druid + Mybatis 多数据源配 ...
- CSS3过渡结束监听事件,清除/修改表单元素的一些默认样式
document.querySelector('div').addEventListener('transitionEnd',function(){ console.log('过度结束') }) 如果 ...
- 关于获取tableView中cell数据的处理
前言 最近在做一个项目的时候遇到了这么一个问题,就是tableview作为一个表单,每一行cell都需要填充一个数据填充完成后再返回到table页面,最后进行总的提交. 解决 ...
- Redis新手的坑,无法连接、缺少类、没有密码
阿西吧,自己太菜了,用SpringBoot调用Redis缓存的时候,出了各种问题,记录一下,大家别学我 本文有自己的经验,也有从其他博客整理来的零零散散的经验. 1.安装Redis 安装redis,一 ...
- 1019 General Palindromic Number (20 分)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- Java中的形参和实参的区别以及传值调用和传引用调用
名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...
- MYSQL索引类型。MYSQLc储存引擎
MYSQL索引类型,MYSQLc储存引擎 MySQL索引创建与删除 MySQL存储引擎的 ...
- 单芯片DP108USB声卡/音频解决方案完全替代CM108/CM108AH
简介 DP108是一种高度集成的单芯片USB音频解决方案.所有重要的模拟模块嵌入DP108,包括双DAC和耳机放大器,ADC和麦克风助力器,锁相环,调节器,和USB收发器.许多功能与跳线或外部EEPR ...