QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果

这篇具有很好参考价值的文章主要介绍了QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简述

前段时间用了QGraphicsView做了一些工作,然而如何实现QGraphicsView的放大缩小的效果也很简单,照鼠标某一点进行缩放,仅靠以下代码对view进行缩放会导致view上的item在放大缩小的过程中跑偏了。

void CustomView::wheelEvent(QWheelEvent *event)
{
// 当前放缩倍数;
qreal scaleFactor = this->matrix().m11();
int wheelDeltaValue = event->delta();
// 向上滚动,放大;
if (wheelDeltaValue > 0)
{
this->scale(1.2, 1.2);
}
// 向下滚动,缩小;
else
{
this->scale(1.0 / 1.2, 1.0 / 1.2);
}
}

我们看一下仅靠以上代码实现的放大缩小的效果。

从下图中我们看到把图中小矩形放到屏幕中央进行放大缩小时,效果还是可以的,但是当我们吧小矩形拖到屏幕靠左位置时(或者靠右,只要不是中央位置),我们发现放大所需时小矩形位置偏移较为严重,为了就解决这个问题,闭关修炼了三天,终于解决了。期间各种百度,看助手文档,后来有位小伙伴推荐了一篇文章用MFC实现了图片按照鼠标点进行放大缩小效果,虽然达到了类似的效果,但是和QGraphicsView的原理不一样。那篇文章中通过放大后重新计算图片的位置,然后在对应位置进行重绘。

最后的最后,在QGraphicsView的源码中找到了方法的思路。

QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果,qt,c++

 

我们再看一下百度地图放大缩小的效果(因为受到了图片大小的限制,就截了一小块)。

大家可以看到鼠标分别放到两个绿色矩形区域进行放大缩小的效果,可以看到都是按照鼠标点进行缩放的。

QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果,qt,c++

 

二、代码之路

好了,上面说明了问题,下面就开始针对这个问题进行解决。话不多说,直接上代码。

void CustomView::wheelEvent(QWheelEvent *event)
{
// 获取当前鼠标相对于view的位置;
QPointF cursorPoint = event->pos();
// 获取当前鼠标相对于scene的位置;
QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y()));
// 获取view的宽高;
qreal viewWidth = this->viewport()->width();
qreal viewHeight = this->viewport()->height();
// 获取当前鼠标位置相当于view大小的横纵比例;
qreal hScale = cursorPoint.x() / viewWidth;
qreal vScale = cursorPoint.y() / viewHeight;
// 当前放缩倍数;
qreal scaleFactor = this->matrix().m11();
int wheelDeltaValue = event->delta();
// 向上滚动,放大;
if (wheelDeltaValue > 0)
{
this->scale(1.2, 1.2);
}
// 向下滚动,缩小;
else
{
this->scale(1.0 / 1.2, 1.0 / 1.2);
}
// 将scene坐标转换为放大缩小后的坐标;
QPointF viewPoint = this->matrix().map(scenePos);
// 通过滚动条控制view放大缩小后的展示scene的位置;
horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale));
verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale));
}

通过上面的代码即可实现QGraphicsView按照鼠标点进行放大缩小的效果。

我们看一下效果,图一中我分别将将小矩形拖到屏幕的上、下、左、右四个方位,我们发现都是按照鼠标点进行了放缩(gif图录制软件在拖到小矩形时生成的图片有点阴影,大家可以忽略)。

图二中,分别将鼠标放置在屏幕的四角,我们可以看到很明确的效果。

图一

QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果,qt,c++

 

图二

QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果,qt,c++

 

附上一张效果图(可能需要放大网页看,相对清楚一点)

QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果,qt,c++ 

 

下面是QGraphicsView::centerOn(const QPointF &pos)方法的源码。以上代码也是参考了这个方法后得到的结果。这个方法也就是通过滑动滚动条的方法将所给的点(该点是相对于scene的)放置在view 的中央位置。而我们想要实现按照鼠标点进行放大缩小效果,只需要计算当前鼠标位置相对于view大小的比例,centerOn方法中是 1/2 ,我们只要替换为相对应的比例即可。文章来源地址https://www.toymoban.com/news/detail-753114.html

/*!
Scrolls the contents of the viewport to ensure that the scene
coordinate \a pos, is centered in the view.
Because \a pos is a floating point coordinate, and the scroll bars operate
on integer coordinates, the centering is only an approximation.
\note If the item is close to or outside the border, it will be visible
in the view, but not centered.
\sa ensureVisible()
*/
void QGraphicsView::centerOn(const QPointF &pos)
{
Q_D(QGraphicsView);
qreal width = viewport()->width();
qreal height = viewport()->height();
QPointF viewPoint = d->matrix.map(pos);
QPointF oldCenterPoint = pos;
if (!d->leftIndent) {
if (isRightToLeft()) {
qint64 horizontal = 0;
horizontal += horizontalScrollBar()->minimum();
horizontal += horizontalScrollBar()->maximum();
horizontal -= int(viewPoint.x() - width / 2.0);
horizontalScrollBar()->setValue(horizontal);
} else {
horizontalScrollBar()->setValue(int(viewPoint.x() - width / 2.0));
}
}
if (!d->topIndent)
verticalScrollBar()->setValue(int(viewPoint.y() - height / 2.0));
d->lastCenterPoint = oldCenterPoint;
}

 进群领取qt开发学习资料以及技术交流  在下方↓↓↓↓↓↓↓↓

到了这里,关于QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • QGraphicsView中重写鼠标事件实现图片的移动

            本文讲的是如何在PyQt5的组件QGraphicsView中重写鼠标事件实现图片的移动。         PyQt5作为强大的GUI编程工具,免不了会拿来做一些图片的显示和处理问题,有的会使用QPainter作为动态显示图片的工具,QLabel是显示静态图片的主推。但是我在工作中遇到了超大

    2023年04月14日
    浏览(14)
  • Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

    Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

    文章说明: 本文初衷是为了记录毕设学习过程,避免忘记操作流程。该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明, 文末将附上实现该功能的代码。后续等答辩完成会把整个Android端代码上传

    2024年02月03日
    浏览(9)
  • 从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

    从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

    注 :需要将 你的ak 替换,从百度地图官网注册申请。 脚本中使用BMap创建Map实例,centerAndZoom()初始化地图设置中心点为北京,地图等级15。enableScrollWheelZoom()鼠标滚轮可缩放窗口。addEventListener监听鼠标点击事件,发生后,传递事件e至function(e),执行openInfoWindow,在鼠标点击坐

    2024年02月07日
    浏览(39)
  • 从零开始学习调用百度地图网页API:三、鼠标点击绘图功能

    从零开始学习调用百度地图网页API:三、鼠标点击绘图功能

    注:需要将 你的ak 替换,ak从百度地图官网注册申请,选择浏览器类型api。 绘制线段 显示对象的位置信息 显示任意点坐标 最初的实现方法,在 显示坐标 按钮多次被点击后,会导致再点击 不显示 按钮,无法remove事件。依然会在地图上点击后出现坐标信息。 这是因为addEve

    2024年02月07日
    浏览(165)
  • vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具

    vue项目引入百度地图BMapGL鼠标绘制和BMap辅助工具

    目录 引言 1、引用百度地图 2、在项目中使用百度地图 2-1、页面结构部分 2-2、js逻辑部分 3-1、页面结构部分 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它旨在平易近人、灵活且可扩展,重点是声明式渲染和基于组件的架构。Vue 的反应性和可组合性使其成为开发复

    2024年01月16日
    浏览(10)
  • 解决百度地图的父元素出现滚轮之后启用鼠标缩放模式之后出现偏移的现象

    解决百度地图的父元素出现滚轮之后启用鼠标缩放模式之后出现偏移的现象

    最近在做项目的时候,有个功能是点击详情按钮的时候在一个弹框里展现出来列表的详情 因为详情弹框里面的数据有其他的表格数据,然后在弹框的下边使用百度地图展示后端发送过来的坐标点,然后把坐标点转换之后使用百度地图的方法制作覆盖物上去。这里边就出现了一

    2024年03月18日
    浏览(12)
  • 【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

    说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。 示例 myitem 为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。 myitem.h myi

    2024年02月04日
    浏览(18)
  • 利用R语言通过百度地图API进行批量地理编码

    利用R语言通过百度地图API进行批量地理编码

    当您有大量的地点名称需要在地图上来呈现时,首先要在在线地图上找到该地址的坐标,通常是指经纬度,如果能够用代码来实现,便少了许多费时费力的体力活儿,以下将详细介绍地理编码的详细实现路径,即使您是一个编程小白,只要会打开软件,也可轻松搞定批量地理

    2024年02月11日
    浏览(31)
  • html 导入百度地图 网页中如何导入百度地图

    html 导入百度地图 网页中如何导入百度地图

    先看案例如图所示 首先我们需要知道我们想要标注地点的经纬度 经纬度查询网址如下 图中以同程大厦为例 经纬度查询定位 拾取坐标系统 经纬度查询地图 好了 准备工作做好 现在开始编码~ 第一步 html css部分 注意点1. #map 命名 不要随意更改 如影响到您的布局 您可以在外面

    2023年04月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包