本文讲的是如何在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,不然等你放松之后,依然会保持按住的情况松不开。文章来源:https://www.toymoban.com/news/detail-413269.html
参数解释,基本上变量名字呢就已经给出了解释,只需要注意mapToScene(event.pos())、horizontalScrollBar().value()、verticalScrollBar().value()三个方法的含义就行,去看官方文档,如果你嫌麻烦就是把self.ui.graphicsView改成你的类里面的那个QGraphicsView的名字就行。文章来源地址https://www.toymoban.com/news/detail-413269.html
到了这里,关于QGraphicsView中重写鼠标事件实现图片的移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!