本文讲的是如何在PyQt5的组件QGraphicsView中重写wheelEvent实现图片的放大缩小。
PyQt5作为强大的GUI编程工具,免不了会拿来做一些图片的显示和处理问题,有的会使用QPainter作为动态显示图片的工具,QLabel是显示静态图片的主推。但是我在工作中遇到了超大tiff图片的处理,一次显示1G大小的图片进行灰度变换与标记等工作,这就需要专业的图片处理Qt的QGraphicsView模块。
QGraphicsView专业到已经封装好了一个滚轮事件实现图片的上下左右移动,这就导致我们的放大缩小事件要重写。重新自定义一套函数来替代已经有的函数想必是无用且浪费时间的,因此我去Q他的官网找使用文档,找到了QGraphicsView中使用到的大部分的部件的名称及其对应的方法,发现:QGraphicsView的定义与滚轮事件是分开的,完全可以在自定义滚轮事件的同时保留QGraphicsView自带的滚动条,而滚动条的大小比例通过QGraphicsView中的scale方法进行操纵的,scale越大,滚动条就越长,图片视野就会变小,进而达到放大图片局部的目的。这样思路就清晰了,调整滚动条的相关方法,将其与scale方法产生关联即可。
详细的整合过程放在下面:
# -*- coding: utf-8 -*-
"""
@author:xiaoyangchicao2020
@time:2022-99-99
"""
def wheel_Event(self, event):
if (event.angleDelta().y() > 0.5):
self.ui.graphicsView.scale(1.5, 1.5)
self.scalenum = self.scalenum * 1.5
elif (event.angleDelta().y() < 0.5):
self.ui.graphicsView.scale(1 / 1.5, 1 / 1.5)
self.scalenum = self.scalenum / 1.5
其中wheel_Event为了区别QGraphicsView自带的wheelEvent,可以自己定义其他的函数名字;event事件是QWidget的关键方法之一,事件方法是封装在Qt里面的,可以直接写;event.angleDelta().y()指的是鼠标中间滚轮滚动的时候,对y改变的角度,我设置的是0.5也就是1/2,可以自己设置更精细的1/8,1/12等;大于0.5对应鼠标滚轮向上,进而对应图片放大,进而就联系到了scale系数,先预设一个scalenum作为图片扩大的倍数,self.ui.graphicsView是我的类里面的一个QGraphicsView的窗口,你们自己的类里面自己命名的QGraphicsView换一下对应的名字就行,都有scale方法,里面的两个参数是初始化时候滚动条的长宽滚动条相对比例。(也可以去官方文档找找看看如何满足你)