当前位置: 首页 > 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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LTE协议栈学习
  • [创业之路-151] :职能部门/非经营部门 VS 业务部门/经营部门划分与职责
  • 为什么推荐使用英文版LabVIEW
  • 论文阅读:Omni-Kernel Network for Image Restoration
  • ESP32运行轻量级 Web 服务器入门(基于ESP-IDF)
  • 【天怡AI-注册安全分析报告-无验证方式导致安全隐患】
  • 从一个文本文件中挑选出符合条件的内容行
  • 大数据:快速入门Scala+Flink
  • 【word密码】word怎么限制格式,但可以修改文字?
  • 编写webpack插件自动上传sourceMap
  • Linux 基本指令(二)
  • 《linux系统》基础操作
  • 电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集
  • Android使用Flow封装一个FlowBus工具类
  • Linux-vim使用
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • CSS实用技巧干货
  • javascript 哈希表
  • jdbc就是这么简单
  • Leetcode 27 Remove Element
  • SQLServer插入数据
  • Vue官网教程学习过程中值得记录的一些事情
  • 观察者模式实现非直接耦合
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端攻城师
  • 前端面试题总结
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 一些css基础学习笔记
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (3)llvm ir转换过程
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (论文阅读11/100)Fast R-CNN
  • (一)为什么要选择C++
  • (转)fock函数详解
  • (转)关于多人操作数据的处理策略
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ***利用Ms05002溢出找“肉鸡
  • .a文件和.so文件
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET Core 中插件式开发实现
  • .net framework profiles /.net framework 配置
  • .NET 快速重构概要1
  • @hook扩展分析
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • [1]-基于图搜索的路径规划基础
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [BZOJ4016][FJOI2014]最短路径树问题