QGraphicsView中鼠标位置图像缩放时不变

设置QGraphicsView的变换锚和调整尺寸锚到鼠标下面的操作,是一个很常见的模式,尤其在实现图形视图的缩放和滚动功能时。这两行代码的作用是提高用户与图形界面交互的直观性和效率。

  1. setTransformationAnchor(QGraphicsView::AnchorUnderMouse):这行代码设置了当你通过变换(例如缩放)QGraphicsView时,变换的中心点应该是当前鼠标所在的位置。这意味着,如果用户正将鼠标指针悬停在视图的某个点上并进行缩放操作,那么这个点将保持在鼠标指针下方,视图其他部分将围绕这个点进行缩放。这种方式使得用户可以非常精确地控制想要仔细查看的部分。

  2. setResizeAnchor(QGraphicsView::AnchorUnderMouse):这行代码设置了当视图窗口大小发生变化(即调整尺寸时),应该保持鼠标下面的图形项位置不变。这样,用户调整视图窗口大小时,可以更方便地继续之前的查看或编辑操作,而不需要重新定位到特定的区域。

举个例子,想象你正在使用一个图形编辑软件查看一个很大的设计图。你把鼠标指针放在图中你感兴趣的细节上,并使用滚轮进行缩放,希望只查看这个部分的细节。如果没有设置AnchorUnderMouse,那么缩放时你可能会发现视图偏离了你希望仔细查看的区域。同样,在调整窗口大小时,如果视图内容相对于窗口的位置发生了改变,这可能会中断你的工作流,因为你需要重新找到那个特定的区域。使用了AnchorUnderMouse后,这些操作会更加便捷和直观。

  //安装view事件到当前父对象ui->graphicsView->viewport()->installEventFilter(this);ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);ui->graphicsView->setResizeAnchor(QGraphicsView::AnchorUnderMouse);

bool ImageGrab::eventFilter(QObject* obj, QEvent* event)
{if (obj== ui->graphicsView->viewport()){//尺寸变化时if (event->type() == QEvent::Resize) {//qInfo() << ui->graphicsView->viewport()->size();m_ViewSize = ui->graphicsView->viewport()->size();//m_pGraphicsScene->setSceneRect(0,0, m_ViewSize.width(), m_ViewSize.height());ui->graphicsView->fitInView(m_pGraphicsScene->sceneRect(), Qt::KeepAspectRatio);m_dMinImageRatio = ui->graphicsView->transform().m11();m_dImageRatio = m_dMinImageRatio;return true;}//鼠标滚轮滚动时,将场景进行缩放else if (event->type() == QEvent::Wheel){QWheelEvent* wheelEvent = (QWheelEvent*)event;int wheelDeltaValue = wheelEvent->angleDelta().y();if ((wheelDeltaValue<0&&m_dImageRatio<= m_dMinImageRatio) || (wheelDeltaValue>0 && m_dImageRatio>= m_dMaxImageRatio)){return true;}if (wheelDeltaValue>0){ui->graphicsView->scale(1.2, 1.2);}else{ui->graphicsView->scale(1/1.2, 1/1.2);}// 当前放缩倍数;m_dImageRatio = ui->graphicsView->transform().m11();return true;}//else if (event->type() == QEvent::MouseButtonPress)}

原来QGraphicsView对于CAD中图元放大缩小早就有了现成的实现。再配合滚轮事件,放大缩小就没啥大问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP+ACCESS公司门户网站建设

【摘 要】随着计算机科学的发展&#xff0c;数据库技术在Internet中的应用越来越广泛&#xff0c;为广大网络用户提供了更加周到和人性化的服务。本文讲解了一个公司的网站的建设&#xff0c;它基于数据关联规则的公司个性化页面及动态数据生成案例&#xff0c;在网页方面&…

甲方怒喷半小时:一次项目上线失败的深刻教训

哈喽大家好,这里是你们的老朋友小米~最近工作忙得不可开交,这不,昨夜又是一个通宵夜,因为一些原因导致了项目上线失败。今天在会议上被甲方喷了整整半个小时,我心里五味杂陈,但作为一个技术分享爱好者,我决定把这次经历记录下来,希望能给大家一些启发。 需求背景:一个…

HDFS,HBase,MySQL,Elasticsearch ,MongoDB分别适合存储什么特征的数据?

HDFS&#xff08;Hadoop Distributed File System&#xff09;通常用于存储大规模数据&#xff0c;适合存储结构化和非结构化数据&#xff0c;例如文本文件、日志数据、图像和视频等。 HBase是基于Hadoop的分布式数据库&#xff0c;适合存储大量非结构化和半结构化的数据&…

编程基础:掌握运算符与优先级

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、运算符的基石&#xff1a;加减乘除 二、比较运算符&#xff1a;判断数值大小 三、整除…

【Redis】String源码剖析:512MB大字符串的内存管理之道

大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa…

WebSocket——相关介绍以及后端配置

一、WebSocket介绍&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;旨在改进客户端和服务器之间的实时通信。以下是关于WebSocket的详细介绍&#xff1a; 1、定义与标准 WebSocket是独立的、创建在TCP上的协议&#xff0c;通过HTTP/1.1协议的10…

13.js对象

定义 一种复杂数据类型&#xff0c;是无序的&#xff08;不保留键的插入顺序&#xff09;&#xff0c;以键值对&#xff08;{key:value})形式存放的数据集合 对象的创建 &#xff08;1&#xff09;字面量创建 var 对象名{ } &#xff08;2&#xff09;内部构造函数创建 v…

【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【iOS】——工厂设计模式

文章目录 一、设计模式创建型模式结构型模式行为型模式 二、设计模式七大准则三、简单工厂模式四、工厂方法模式五、抽象工厂模式 一、设计模式 设计模式是指在特定上下文中解决常见问题时所采用的一套可复用的解决方案。这些模式是面向对象编程中的通用概念&#xff0c;广泛应…

Docker安装OnlyOffice

工作需要&#xff0c;多人在线编辑同一文档&#xff0c;找了一圈发现onlyoffice满足需求&#xff0c;于是使用docker安装了社区版本。下面记录下安装过程。 Onlyoffice 是什么&#xff1f; Onlyoffice 是一个多端协同的 Office 办公套件&#xff0c;相当于微软的 Office365 全…

【Linux网络编程】传输层中的TCP和UDP(TCP篇)

【Linux网络编程】传输层中的TCP和UDP&#xff08;TCP篇&#xff09; 目录 【Linux网络编程】传输层中的TCP和UDP&#xff08;TCP篇&#xff09;TCP协议TCP协议段格式确认应答&#xff08;ACK&#xff09;机制&#xff08;保证可靠性&#xff09;超时重传机制连接管理机制理解T…

ingress-nginx控制器安装(ingress ImagePullBackOff )

支持的版本&#xff08;查看自己的kubernetes版本替换安装过程中的版本选择合适的版本安装&#xff09; 安装过程&#xff1a; 这里不采用helm的方式&#xff0c;而是采用YAML manifest的方式来安装。 下载ingress-nginx的https://raw.githubusercontent.com/kubernetes/ingr…

多线程事务

一、业务场景 我们在工作中经常会到往数据库里插入大量数据的工作&#xff0c;但是既需要保证数据的一致性&#xff0c;又要保证程序执行的效率。因此需要在多线程中使用事务&#xff0c;这样既可以保证数据的一致性&#xff0c;又能保证程序的执行效率。但是spring自带的Trans…

并发编程笔记7--并发编程基础

1、线程简介 1.1、什么是线程 现代操作系统中运行一个程序&#xff0c;会为他创建一个进程。而每一个进程中又可以创建许多个线程。现代操作系统中线程是最小的调度单元。 两者关系&#xff1a;一个线程只属于一个进程&#xff0c;而一个进程可以拥有多个线程。线程是一个轻量…

微服务01-Eureka Ribbon

微服务 我的个人地址 微服务是一种架构风格&#xff0c;旨在将单一应用程序拆分为一组小型、独立部署的服务&#xff0c;每个服务都围绕特定的业务功能进行构建。这些服务 之间通过轻量级的通信机制互相通信&#xff0c;比如使用HTTP协议或消息队列。微服务架构提供了灵活性和…

CS 下载安装详解

目录 CS简介&#xff1a; CS下载地址&#xff1a; CS的安装&#xff1a; CS简介&#xff1a; CS为目前渗透中常用的一款工具&#xff0c;它的强大在于控制windows木马&#xff0c;CS主要控制windows木马。 CS下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/…

WordPress Country State City Dropdown CF7插件 SQL注入漏洞复现(CVE-2024-3495)

0x01 产品简介 Country State City Dropdown CF7插件是一个功能强大、易于使用的WordPress插件,它为用户在联系表单中提供国家、州/省和城市的三级下拉菜单功能,帮助用户更准确地填写地区信息。同时,插件的团队和支持也非常出色,为用户提供高质量的服务。 0x02 漏洞概述 …

内存分配算法

一、实验目的&#xff1a; 实验目的&#xff1a; 通过编写一个内存分配模拟程序&#xff0c;实现首次适应算法&#xff08;First Fit&#xff09;、循环首次适应算法&#xff08;Next Fit&#xff09;、最佳适应算法&#xff08;Best Fit&#xff09;和最差适应算法&#xff08…

【Pytorch】【MacOS】14.m1芯片使用mps进行深度模型训练

读者要先自行安装python以及anaconda&#xff0c;并且配置pytorch环境 第一步 测试环境 import torch # 判断macOS的版本是否支持 print(torch.backends.mps.is_available()) # 判断mps是否可用 print(torch.backends.mps.is_built())如果第一个语句为False&#xff0c;说明当前…

Python简介

Python简介 1. Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环…