Qt QGraphicsItem获取鼠标位置对应图像坐标

本次使用了QGraphicsView来加载图像,然后给其设置了一个QGraphicsScene场景,再给场景添加了一个自定义的QGraphicsItem,在其中重写了paint事件,用来重绘图像。


正常情况时,QGraphicsItem上图像的有效区域QRect大小和QGraphicsView一致,此时正好铺满,鼠标位置的坐标可以比较轻松的推算出其在图像有效区域的全局坐标。
当个人碰到的某些时候,QGraphicsItem上图像的有效区域QRect大小并不和QGraphicsView一致,比如宽度留白了,即左右两边有空缺。此时发现如果用正常的方法去获取鼠标位置坐标在图像有效区域的全局坐标,会得到不准确的坐标。明明是鼠标在图像的顶点,却可能x坐标或y坐标不从0开始。

在这里插入图片描述


针对这种情况,使用以下几句可以得到鼠标位置在图像有效区域的全局坐标。
class ImgShow : public QObject, public QGraphicsItem
{Q_OBJECT
public:ImgShow(QRectF rect);~ImgShow() override;void UpdateImageRect(QRectF rect);void UpdateImageShow(QPixmap pix);protected:virtual QRectF boundingRect() const override;virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;void hoverMoveEvent(QGraphicsSceneHoverEvent* event);private:QRectF curRect;QPixmap curPix;QMutex mtx;
};

cpp


ImgShow::ImgShow(QRectF rect)
{curRect = rect;//使其在鼠标未点击也能响应悬停事件setAcceptHoverEvents(true);
}ImgShow::~ImgShow()
{}void ImgShow::UpdateImageRect(QRectF rect)
{mtx.lock();curRect = rect;mtx.unlock();
}void ImgShow::UpdateImageShow(QPixmap pix)
{mtx.lock();curPix = pix;mtx.unlock();// 设置玩图像数据后刷新图像QGraphicsView * view = this->scene()->views().at(0);view->viewport()->update();
}QRectF ImgShow::boundingRect() const
{return curRect;
}void ImgShow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{mtx.lock();
//    painter->drawPixmap(-static_cast<int>(curRect.width() / 2), -static_cast<int>(curRect.height() / 2), curPix);//上面的drawPixmap起始位置不太一样painter->drawPixmap(curRect.toRect(), curPix);qDebug()<< curRect.width() << curRect.height();mtx.unlock();
}void ImgShow::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
{QPointF localPos = event->pos(); // 当前鼠标位置相对于图元坐标系的坐标QRectF imageRect = mapRectToScene(boundingRect()); // 图像有效区域在场景中的位置QPointF globalPos = scenePos() + localPos - imageRect.topLeft(); // 转换为图像有效区域的全局坐标qDebug()<< globalPos;
}//scenePos()为图元在场景的坐标,因此 scenePos() + localPos 为鼠标在场景坐标系的坐标
//imageRect.topLeft()为图像有效区域的左上角在图元坐标系的位置,因此 localPos - imageRect.topLeft() 为当前鼠标事件在图片局部坐标系中的位置

当图像的有效区域并不是铺满图元时,就可以用该方式得到,当前鼠标位置对于图像有效区域的全局坐标

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

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

相关文章

基于爬虫和Kettle的豆瓣电影的采集与预处理

一&#xff1a;爬虫 1、爬取的目标 将豆瓣电影网上的电影的基本信息&#xff0c;比如&#xff1a;电影名称、导演、电影类型、国家、上映年份、评分、评论人数爬取出来&#xff0c;并将爬取的结果放入csv文件中&#xff0c;方便存储。 2、网站结构 图1豆瓣网网站结构详…

Polars使用指南(二)

在上一篇文章中&#xff0c;我们介绍了Polars的优势和Polars.Series的常用API&#xff0c;本篇文章我们继续介绍Polars.Series的扩展API。 对于一些特殊的数据类型&#xff0c;如 pl.Array、list、str 等&#xff0c;Polars.Series 提供了基于属性的直接操作API&#xff0c;如…

Web前端 ---- 【Vue3】Proxy响应式原理

目录 前言 安装Vue3项目 安装 Proxy 语法格式 前言 从本文开始进入vue3的学习。本文介绍vue3中的响应式原理&#xff0c;相较于vue2中通过object.defineProperty&#xff08;vue2中的响应式&#xff09;来实现响应式&#xff0c;vue3中换成了Proxy来进行实现。 安装Vue3项目…

Linux---gcc编译

目录 前言 一、gcc编译 二、程序的编译过程 三、gcc查看编译过程 1.预处理阶段 2.编译 3.汇编 4.链接 动静态库链接的内容 动静态库链接的优缺点 5.总结记忆 前言 在前面我们学会使用vim对文件进行编辑&#xff0c;如果是C或者C程序&#xff0c;我们编辑好了内容…

C++多态与虚函数的使用注意

文章目录 什么情况下用多态构造和析构的顺序为什么要把析构函数声明为虚函数为什么不能在构造函数和析构函数中使用虚函数什么情况下用多态 多态是面向对象编程中的一个重要概念,可以提高代码的可扩展性和可维护性。在以下情况下,可以考虑使用多态: 当有一个基类或接口,并…

监督学习 - 决策树(Decision Trees)

什么是机器学习 决策树&#xff08;Decision Trees&#xff09;是一种基于树形结构进行决策的模型&#xff0c;广泛应用于分类和回归任务。它通过对数据集进行递归划分&#xff0c;构建一棵树&#xff0c;每个节点代表一个特征&#xff0c;每个分支代表一个决策规则&#xff0…

数据结构二叉树创建及例题(上)

今天就带领大家来到树的世界,树无论是在考试上还是实际学习方面都是比较重点的,大家在这块知识要花时间搞懂. 文章目录 前言 一、树的二叉链表定义 二、二叉树三种遍历方式(递归方式) 1.先序遍历方式(根左右) 2.中序遍历方式(左根右) 3.后序遍历方式(左右根) 三、二叉树的…

单片机I/O口驱动MOS管

自记录&#xff1a; 使用单片机做一个PLC,输出可如下两种情况&#xff1a; 单片机I/O口驱动&#xff0c;为什么一般都选用三极管而不是MOS管&#xff1f; 1.单片机的IO口&#xff0c;有一定的带负载能力。但电流很小&#xff0c;驱动能力有限&#xff0c;一般在10-20mA以内。…

go-zero是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

go-zero是一个基于Go语言的Web和微服务开发框架&#xff0c;它提供了一系列的工具和库&#xff0c;帮助开发者构建高性能、可扩展的应用程序。go-zero采用了领域驱动设计&#xff08;DDD&#xff09;和依赖注入&#xff08;DI&#xff09;等先进的设计理念&#xff0c;使得开发…

Redis面试题10

Redis 支持哪些数据结构&#xff1f; Redis 支持以下几种常用的数据结构&#xff1a; 字符串&#xff08;String&#xff09;&#xff1a;用于存储字符串值&#xff0c;可以是文本或二进制数据。 列表&#xff08;List&#xff09;&#xff1a;用于存储一个有序的字符串列表&am…

用通俗易懂的方式讲解大模型分布式训练并行技术:序列并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

Maven_下载_安装_配置

文章参考&#xff1a;https://zhuanlan.zhihu.com/p/615382243 Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 maven优点&#xff1a;…

31K+ stars 超炫酷的 Docker 可视化开源工具

31K stars 超炫酷的 Docker 可视化开源工具 原创 小奇 爱编程爱技术 2024-01-10 09:02 发表于北京 今天给大家分享一个适合开发人员使用的 Docker 可视化工具&#xff1a;LazyDocker。基于终端的一个可视化管理工具&#xff0c;支持健盘操作和鼠标点击。 相比 Portainer 功能没…

CCF模拟题 202309-2 坐标变换(其二)

问题描述 试题编号&#xff1a; 202309-2 试题名称&#xff1a; 坐标变换&#xff08;其二&#xff09; 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 对于平面直角坐标系上的坐标 &#xff08;x,y&#xff09;&#xff0c;小 P 定义了如下两…

为什么推荐大家使用动态住宅ip?怎么选择?

编辑代理ip的类型有很多&#xff0c;本文来介绍什么是动态住宅ip&#xff0c;为什么很多博主都推荐使用动态住宅ip&#xff0c;他到底有什么好处呢&#xff0c;接下来我们来学习一下。 一、什么是动态住宅ip 网络上的代理供应商很多&#xff0c;通常我们接触的比较多的几种类…

Python 实践——外星人入侵小游戏(上)

Python 实践——外星人入侵小游戏&#xff08;上&#xff09; 目录 Python 实践——外星人入侵小游戏&#xff08;上&#xff09;安装pip/pygame1.开始项目2.设置屏幕背景色基本操作&#xff1a; 3. 设置类4. 添加飞船图像5.导入程序基本操作&#xff1a;完整&#xff1a; 总结…

Springboot3+EasyExcel由浅入深

环境介绍 技术栈 springboot3easyexcel 软件 版本 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、…

洛阳展馆讲解器,博物馆讲解器,无线讲解器出租,会展讲解器

无线一对多团队解说器的特点比较多&#xff0c;比如&#xff1a;1、声音传输的时分可以反抗噪音等&#xff0c;不会遭到搅扰。2、便利性&#xff0c;像这么细巧的语音导览可以随身携带&#xff0c;十分的便利。3、可以免去很多繁琐的进程&#xff0c;变得简单高效。4、明晰性&a…

mysql索引失效场景与mysql优化方式

索引失效场景 联合索引不满足最左匹配原则 索引列参与了运算&#xff0c;会导致全表扫描&#xff0c;索引失效 索引列参使用了函数 模糊查询时&#xff08;like语句&#xff09;&#xff0c;模糊匹配的占位符位于条件的左侧 like %abc&#xff0c;like %abc% 都会导致失效…

【JVM的相关参数和调优】

文章目录 JVM 调优的参数类型一、标配参数二、X参数三、XX参数 JVM 调优的常用参数 JVM 调优的参数类型 一、标配参数 这类此参数在jdk的各个版本之间很少会变化&#xff0c;基本不改变 java -version&#xff0c;查看当前电脑上的jdk的版本信息 java -help&#xff0c;查看…