当前位置: 首页 > news >正文

PySide(PyQT)的mouseMoveEvent()和hoverMoveEvent()的区别

        在 PySide中,mouseMoveEvent 和 hoverMoveEvent 都是用于处理鼠标移动相关操作的事件,但它们之间存在明显的区别:

  • 事件触发条件

        • mouseMoveEvent:
        当鼠标在对应的图形项(如 QGraphicsPixmapItem)上移动,并且至少有一个鼠标按钮被按下时,mouseMoveEvent 会被触发。简单来说,它主要处理鼠标拖动操作。需要注意的是,要使图形项能够接收拖动事件,必须setFlag(QGraphicsItem.ItemIsSelectable, True),使其可以被选择。如果设置可了移动:setFlag(QGraphicsItem.ItemIsMovable, True)  ,按住鼠标左键直接就可以将其拖动。拖动的demo见:PySide(PyQt),QGraphicsItem的父子图像项的一个练习demo-CSDN博客

        • hoverMoveEvent:
        当鼠标在对应的图形项上移动,且没有任何鼠标按钮被按下时,hoverMoveEvent 会被触发,也就是单纯的鼠标悬停移动。需要注意的是,要使图形项能够接收悬停事件,必须调用 setAcceptHoverEvents(True) 方法来启用悬停事件的接收。  

  • 事件对象

        • mouseMoveEvent:
        该事件接收的是 QMouseEvent 类型的事件对象。QMouseEvent 提供了丰富的信息和方法,例如可以使用 buttons() 方法来检查哪些鼠标按钮被按下,使用 pos() 方法获取鼠标相对于图形项的位置,使用 scenePos() 方法获取鼠标在场景中的位置等。

        • hoverMoveEvent:
        该事件接收的是 QGraphicsSceneHoverEvent 类型的事件对象。QGraphicsSceneHoverEvent 主要关注鼠标悬停相关的信息,它没有 buttons() 方法,因为悬停时鼠标按钮是未按下状态。不过可以使用 pos() 获取鼠标相对于图形项的位置,使用 scenePos() 获取鼠标在场景中的位置。  

  • 用途场景

        • mouseMoveEvent:
        常用于实现拖动效果,比如拖动图形项在场景中移动、调整图形项的大小等操作。在一些绘图应用中,用户按住鼠标左键拖动可以绘制线条、矩形框或者移动已经绘制好的图形。

        • hoverMoveEvent:
        通常用于实现鼠标悬停提示信息、高亮显示等效果。例如,当鼠标悬停在地图上的某个区域时,显示该区域的详细信息;或者当鼠标悬停在某个图形项上时,改变图形项的颜色以突出显示。

  • 用法示例

import sys
from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGraphicsItem
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qtclass CustomPixmapItem(QGraphicsPixmapItem):def __init__(self, pixmap):super().__init__(pixmap)# 启用悬停事件self.setAcceptHoverEvents(True)# 启用选择事件self.setFlag(QGraphicsItem.ItemIsSelectable, True)def hoverMoveEvent(self, event):print("鼠标悬停移动,位置:", event.pos())super().hoverMoveEvent(event)def mouseMoveEvent(self, event):if event.buttons() & Qt.LeftButton:print("鼠标左键按下并移动,位置:", event.pos())super().mouseMoveEvent(event)if __name__ == "__main__":app = QApplication(sys.argv)scene = QGraphicsScene()pixmap = QPixmap("example.jpg")if pixmap.isNull():print("无法加载图像")sys.exit(1)item = CustomPixmapItem(pixmap)scene.addItem(item)view = QGraphicsView(scene)view.show()sys.exit(app.exec())


http://www.mrgr.cn/news/94242.html

相关文章:

  • java中小型公司面试预习资料(四):微服务架构
  • Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能
  • Visual Studio 安装及使用教程(Windows)【安装】
  • JavaScript_Day2
  • 江科大51单片机笔记【16】AD/DA(上)
  • 环境配置 | 5分钟极简Git入门:从零上手版本控制
  • IP 地址
  • ROS实践(四)机器人建图(gmapping)
  • 3.数据结构-串、数组和广义表
  • 使用Leaflet 搭建一个前端地图项目,实现类似原神、黑神话悟空的标点互动地图效果
  • 云效、流水线、Gradle缓存问题、build.gradle配置snapshot
  • css 知识点整理
  • vue-next-admin修改配置指南
  • python 面试题
  • 使用arm嵌入式编译器+makefile编译管理keil项目
  • node.js-node.js作为服务器,前端使用WebSocket(单个TCP连接上进行全双工通讯的协议)
  • 江科大51单片机笔记【10】DS1302时钟可调时钟(下)
  • 江科大51单片机笔记【15】直流电机驱动(PWM)
  • Android ANR 监控方法与事件分发耗时优化实战
  • 江科大51单片机笔记【12】AT24C02(I2C总线)