QGraphicsView中重写鼠标事件实现图片的移动

        本文讲的是如何在PyQt5的组件QGraphicsView中重写鼠标事件实现图片的移动。

        PyQt5作为强大的GUI编程工具,免不了会拿来做一些图片的显示和处理问题,有的会使用QPainter作为动态显示图片的工具,QLabel是显示静态图片的主推。但是我在工作中遇到了超大tiff图片的处理,一次显示1G大小的图片进行灰度变换与标记等工作,这就需要专业的图片处理Qt的QGraphicsView模块。

        QGraphicsView专业到已经封装好了一个鼠标移动事件,也就是一句代码:

        

self.ui.graphicsView.setDragMode(QGraphicsView.ScrollerHandDrag)

        elf.ui.graphicsView是我的类里面的一个QGraphicsView的窗口,你们自己的类里面自己命名的QGraphicsView换一下对应的名字就行。

        但是这个函数由于是封装好的,已经占用了mousePressEvent、mouseMoveEvent、mouseReleaseEvent三个方法,这就导致一个很令人难受的结果,你要是使用拖动效果,就只能实现拖动效果,自定义任意一个鼠标事件都会到时这句代码的效果失效。没办法,为了实现更多的功能,我们要重写移动事件。



# -*- coding: utf-8 -*-
"""
@author:xiaoyangchicao2020
@time:2022-99-99
"""
self.imgopened = False
self.leftpressed = False
self.scalenum = 5    
def mouse_press(self, event):
        button = event.button()
        if button == qc.Qt.LeftButton:
            self.leftpressed = True
            self.startpos = self.ui.graphicsView.mapToScene(event.pos())

    def mouse_move(self,event):
        if  self.leftpressed ==True:
            self.endpos = self.ui.graphicsView.mapToScene(event.pos())
            oposx = self.ui.graphicsView.horizontalScrollBar().value()
            oposy = self.ui.graphicsView.verticalScrollBar().value()
            offset = self.endpos - self.startpos
            nposx = oposx - offset.x() * self.scalenum
            nposy = oposy - offset.y() * self.scalenum
            self.ui.graphicsView.horizontalScrollBar().setValue(nposx)
            self.ui.graphicsView.verticalScrollBar().setValue(nposy)

    def mouse_release(self, event):
        button = event.button()
        if button == qc.Qt.LeftButton:
            self.leftpressed = False

        鼠标事件包含三个子事件,很不错的是,所有事件都可由通过event参数来调用和返回,这就提供了我们自定义函数的很大的空间。

        下面是代码的解释。

        先是mousePressEvent,按下的时候会发生什么。我在上面定义了是否按下的一个布尔值,只有在左键点击之后变为True才能进行下面代码的操作。这个时候返回现在鼠标点击的坐标,为了后续操作打基础。

        再是移动事件,为了使移动变得顺畅,我们每移动一次鼠标就要进行一次图片的重绘,而重绘的偏移量就是鼠标结束坐标减去鼠标的开始坐标,这样,在按下左键之后,只要鼠标移动,就一直重绘。

        最后是结束事件,开始的时候bool值变成了True,那么鼠标释放的时候就要改成False,不然等你放松之后,依然会保持按住的情况松不开。

        参数解释,基本上变量名字呢就已经给出了解释,只需要注意mapToScene(event.pos())、horizontalScrollBar().value()、verticalScrollBar().value()三个方法的含义就行,去看官方文档,如果你嫌麻烦就是把self.ui.graphicsView改成你的类里面的那个QGraphicsView的名字就行。

你可能感兴趣的:(前端,python,qt,ui,qt5)