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

pyqt QGraphicsView 以鼠标为中心进行缩放

注意几个关键点:

1. 初始化

class CustomGraphicsView(QGraphicsView):def __init__(self, parent=None):super(CustomGraphicsView, self).__init__(parent)self.scene = QGraphicsScene()self.setScene(self.scene)self.setGeometry(0, 0, 1024, 600)# 以下初始化代码较为重要self.setMouseTracking(True)self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)   # 按需开启# self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)   # 按需开启     self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)

2. 关键实现函数:重定义滚轮缩放事件(可能会达不到预期效果,请看步骤3或确认初始化)

def wheelEvent(self, event: QWheelEvent) -> None:if event.modifiers() == Qt.ControlModifier:mouse_pos = event.pos()scene_pos = self.mapToScene(mouse_pos) #缩放前鼠标在scene的位置s = 1.2 #按需调整if(event.angleDelta().y() > 0):self.scale(s,s)else:self.scale(1/s,1/s)view_point = self.mapFromScene(scene_pos) #缩放后原scene进行映射新鼠标位置self.verticalScrollBar().setValue(int(view_point.y()-mouse_pos.y())) #通过滚动条进行移动视图self.horizontalScrollBar().setValue(int(view_point.x()-mouse_pos.x()))return else:return super().wheelEvent(event) # 保证滚动条能滚动

3. 如果未到达预期效果,可能还需重写所有鼠标事件:

def mousePressEvent(self, event: QMouseEvent) -> None:if event.button() == Qt.LeftButton:self.dragStartPos = event.pos() #用于鼠标拖拽视图return
def mouseReleaseEvent(self, event: QMouseEvent) -> None:passreturn
def mouseMoveEvent(self, event):if event.buttons() and Qt.LeftButton: # 实现鼠标拖拽视图newpos = event.pos()delta = newpos - self.dragStartPosself.dragStartPos = newposself.verticalScrollBar().setValue(self.verticalScrollBar().value() - delta.y())self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - delta.x())return

仅此记录,未重定义鼠标所有事件导致了近半个月的苦恼,虽然修复了但是仍不知道什么原因

http://www.lryc.cn/news/454083.html

相关文章:

  • FPGA-Vivado-IP核-逻辑分析仪(ILA)
  • 基于webComponents的纯原生前端框架
  • OpenCV-背景建模
  • 一个简单的摄像头应用程序6
  • Pikachu-目录遍历
  • 用Python实现基于Flask的简单Web应用:从零开始构建个人博客
  • IDEA的lombok插件不生效了?!!
  • CSP-S 2022 T1假期计划
  • 为什么要学习大模型?AI在把传统软件当早餐吃掉?
  • 全流程Python编程、机器学习与深度学习实践技术应用
  • pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)
  • jquery on() 函数绑定无效
  • 数字化转型与企业创新的双向驱动
  • [uni-app]小兔鲜-07订单+支付
  • Oracle数据库中表压缩的实现方式和特点
  • 【C语言】基础篇
  • Meta MovieGen AI:颠覆性的文本生成视频技术详解
  • 个人文章合集 - 前端相关
  • R语言的下载、安装及环境配置(RstudioVSCode)
  • 解决使用重载后的CustomWidget无法正常显示但原生的QWidget却能正常显示的问题
  • 微服务Sleuth解析部署使用全流程
  • 最具有世界影响力的人颜廷利:全球著名哲学家思想家起名大师
  • Ubuntu22.04 Docker 国内安装最靠谱教程
  • ceph pg rebalance
  • 大模型/Sora/世界模型之间是什么关系,对自动驾驶的意义是什么?
  • 17岁孩子开发AI应用,4个月入百万,人人都是AI产品经理的时代快来了
  • Django一分钟:DRF ViewSet烹饪指南,创建好用的视图集
  • SEO友好的wordpress模板 应该具体哪些特征
  • 1.MySQL存储过程基础(1/10)
  • linux中使用docker命令时提示权限不足