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

这篇具有很好参考价值的文章主要介绍了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的名字就行。文章来源地址https://www.toymoban.com/news/detail-413269.html

到了这里,关于QGraphicsView中重写鼠标事件实现图片的移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QGraphicsView如何使图片以鼠标为中心进行放缩

    顺带说一句,下面的代码放在了一个继承了QMainWindow的自定义class里面,这个类包含着一个QGraphicsView部件,所有以下的代码都会以为处在类中而出现对应的首行缩进。 因为QGraphicsView是从Qt整个改过来的,自然包含了所有的部件,其中就有所用到的三句话: self.ui.graphicsView.se

    2024年02月13日
    浏览(36)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

    2024年02月10日
    浏览(103)
  • CSS 实现鼠标移动到图片上图片变大,不改变盒子大小

    实现鼠标经过图片时,图片等比放大,但是图片的父盒子不会改变;主要使用了 css 的动画来实现。

    2024年02月05日
    浏览(58)
  • Vue实现鼠标悬浮隐藏与显示图片效果 @mouseenter 和 @mouseleave事件

    前端vue 有个功能是鼠标移动到指定item上显示出来一个编辑和删除的图标 鼠标悬停在列表那么需要有悬浮显示的列表编辑和删除icon 文字不好描述,因为是web端录屏也比较麻烦 这里用截图说明 之前没做过这种效果,问了一下我的组长-豪哥 他告诉我很简单,利用vue的@mouseent

    2023年04月08日
    浏览(84)
  • QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果

    前段时间用了QGraphicsView做了一些工作,然而如何实现QGraphicsView的放大缩小的效果也很简单,照鼠标某一点进行缩放,仅靠以下代码对view进行缩放会导致view上的item在放大缩小的过程中跑偏了。 我们看一下仅靠以上代码实现的放大缩小的效果。 从下图中我们看到把图中小矩形

    2024年02月05日
    浏览(59)
  • 鼠标事件以及 onmouseover, onmouseout 鼠标移动事件动态渲染的注意点

    指的是鼠标在进入某个元素的时候触发的事件 指的是鼠标在离开某个元素时触发的事件 onclick-------------------------------------鼠标单击触发 ondblclick----------------------------------鼠标双击触发 onmousemove---------------鼠标在上面移动时触发 核心点以及坑点.onmouseover, onmouseout 如果绑定在同

    2024年02月15日
    浏览(33)
  • vue 设置全局鼠标移动事件

    要设置全局鼠标移动事件,可以使用 Vue 的 mixin 实现。在 mixin 中,我们可以使用 $on 方法监听 mousemove 事件,并在组件销毁时使用 $off 方法移除监听器,以避免内存泄漏。以下是一个例子: 这样,每个组件都可以使用全局鼠标移动事件,而不需要在每个组件中单独设置。

    2024年02月09日
    浏览(33)
  • JavaScript鼠标移动事件及案例

    一、鼠标点击事件 1.onclick单击事件         鼠标单击时事件处理函数 input type=\\\"button\\\" id=\\\"bt\\\" value=\\\"点击\\\" script //找到按钮并设置点击事件    document.getElementById(\\\"bt\\\").onclick  = function (){         //被点击后弹出弹出框        alert(\\\"按钮被点击\\\")    } /script 2.ondblclick双击事件  鼠

    2023年04月08日
    浏览(35)
  • 【Unity功能】鼠标移动触发事件方法

     方法一:方法触发 注意:UGUI不能使用该方法 方法二:Event Trigger 注意:需要场景中包含EventSystem(在添加trigger组件后自动添加);UGUI可以使用 方法三:

    2024年01月25日
    浏览(31)
  • Qt 鼠标按下移动释放事件

    QEvent::MouseButtonPress ​ 鼠标按下时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseMove ​ 鼠标移动时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseButtonRelease ​ 鼠标释放时,触发该事件,它对应的子类是 QMouseEvent 自定义一个标签控件 LabelX ,让它继承自 QLabel ,然后

    2024年01月22日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包