QGraphicsView实现简易地图10『自适应窗口大小』

前文链接:QGraphicsView实现简易地图9『层级缩放显示底图』
自适应窗口大小
当地图窗口放大或缩小的时候,需要地图能够动态覆盖整个视口。
1、动态演示效果
在这里插入图片描述

2、核心代码

注:WHMapView继承自MapView
void WHMapView::resize()
{if (m_curLevel >= 0)moveScene();
}void MapView::moveScene()
{QString appPath = QApplication::applicationDirPath();QString dirPath = QString("%1/MapData/GaoDeMap/Map/MapPng/L0%2").arg(appPath).arg(m_curLevel + 1);// 视口宽度和高度int vw = viewport()->width();int vh = viewport()->height();// 计算呈现的瓦片地图左上角的场景坐标和视口坐标、呈现的瓦片地图右下角的场景坐标和视口坐标QPoint topLeftScenePos(m_topLeftTileCoord.x * PIXMAP_SIZE, m_topLeftTileCoord.y * PIXMAP_SIZE);QPointF topLeftViewPos = mapFromScene(topLeftScenePos);QPoint bottomRightScenePos(m_bottomRightTileCoord.x * PIXMAP_SIZE, m_bottomRightTileCoord.y * PIXMAP_SIZE);QPointF bottomRightViewPos = mapFromScene(bottomRightScenePos);int mapSideCount = pow(2, m_curLevel);if (MapUtility::sceneSize(m_curLevel) > vw){// 1、水平瓦片坐标控制:判断最左侧瓦片是否完全进入视口、最右侧瓦片是否完全离开视口if (topLeftViewPos.x() > 0){int count = qCeil(topLeftViewPos.x() / PIXMAP_SIZE);			// 左侧进入视口瓦片数量m_topLeftTileCoord.x = qMax(m_topLeftTileCoord.x - count, 0);	// 更新现左侧瓦片坐标X}if (bottomRightViewPos.x() > vw){int count = qFloor((bottomRightViewPos.x() - vw) / PIXMAP_SIZE) + 1;	// 右侧离开视口瓦片数量m_bottomRightTileCoord.x = qMax(m_bottomRightTileCoord.x - count, 0);	// 更新现右侧瓦片坐标X}// 2、水平瓦片坐标控制:判断最右侧瓦片是否完全进入视口、最左侧瓦片是否完全离开视口if (bottomRightViewPos.x() + PIXMAP_SIZE < vw){int count = qCeil((vw - (bottomRightViewPos.x() + PIXMAP_SIZE)) / PIXMAP_SIZE);			// 右侧进入视口瓦片数量m_bottomRightTileCoord.x = qMin(m_bottomRightTileCoord.x + count, mapSideCount - 1);	// 保存现右侧瓦片坐标X}if (topLeftViewPos.x() + PIXMAP_SIZE < 0){int count = qFloor(fabs(topLeftViewPos.x()) / PIXMAP_SIZE);						// 左侧离开视口瓦片数量m_topLeftTileCoord.x = qMin(m_topLeftTileCoord.x + count, mapSideCount - 1);	// 保存现左侧瓦片坐标X}}if (MapUtility::sceneSize(m_curLevel) > vh){// 3、垂直瓦片坐标控制:判断最上侧瓦片是否完全进入视口,最下侧瓦片是否完全离开视口if (topLeftViewPos.y() > 0){int count = qCeil(topLeftViewPos.y() / PIXMAP_SIZE);			// 上侧进入视口瓦片数量m_topLeftTileCoord.y = qMax(m_topLeftTileCoord.y - count, 0);	// 保存现上侧瓦片坐标Y}if (bottomRightViewPos.y() > vh){int count = qFloor((bottomRightViewPos.y() - vh) / PIXMAP_SIZE) + 1;	// 下侧离开视口瓦片数量m_bottomRightTileCoord.y = qMax(m_bottomRightTileCoord.y - count, 0);	// 保存现下侧瓦片坐标Y}// 4、垂直瓦片坐标控制:判断最下侧瓦片是否完全进入视口,最上侧瓦片是否完全离开视口if (bottomRightViewPos.y() + PIXMAP_SIZE < vh){int count = qCeil((vh - (bottomRightViewPos.y() + PIXMAP_SIZE)) / PIXMAP_SIZE);			// 下侧进入视口瓦片数量m_bottomRightTileCoord.y = qMin(m_bottomRightTileCoord.y + count, mapSideCount - 1);	// 保存现下侧瓦片坐标Y}if (topLeftViewPos.y() + PIXMAP_SIZE < 0){int count = qFloor(fabs(topLeftViewPos.y()) / PIXMAP_SIZE);						// 上侧离开视口瓦片数量m_topLeftTileCoord.y = qMin(m_topLeftTileCoord.y + count, mapSideCount - 1);	// 保存现上侧瓦片坐标Y}}// 获取移动前瓦片集合vector<TileCoord> vecOldTileCoord;for (int row = m_viewAndAroundTileRect.top(); row <= m_viewAndAroundTileRect.bottom(); ++row){for (int col = m_viewAndAroundTileRect.left(); col <= m_viewAndAroundTileRect.right(); ++col){vecOldTileCoord.push_back(TileCoord(col, row));}}// 获取移动后瓦片集合vector<TileCoord> vecNewTileCoord, vecAddTileCoord;m_viewAndAroundTileRect = CommonUtility::getViewAndAroundTileCoords(m_topLeftTileCoord.y, m_topLeftTileCoord.x, m_bottomRightTileCoord.y, m_bottomRightTileCoord.x, m_curLevel, vecNewTileCoord);for (const auto &tc : vecNewTileCoord){// ①筛除已加载过的瓦片 ②线程加载存在滞后性,第二次移动时可能第一次m_tileItems还没有加载完毕,所以需要前一次范围作为过滤if (!m_tileItems.contains(tc) && std::find(vecOldTileCoord.begin(), vecOldTileCoord.end(), tc) == vecOldTileCoord.end()){vecAddTileCoord.push_back(tc);}}//showTileCoord();showGraticules();// 上方即为计算瓦片索引的核心代码,省略下方加载瓦片的代码...// 加载瓦片代码...
}

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

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

相关文章

Tmux工具使用案例

Tmux工具使用案例 连接linux一般使用ssh&#xff0c;当ssh会话中需要长时间执行命令时&#xff0c;为了避免命令不受ssh会话影响&#xff0c;除了可以将命令通过nohup <cmd> &等方法放到后台执行外&#xff0c;也可以利用Tmux这个工具解绑SSH会话与执行命令&#xff…

机器学习第二天(监督学习,无监督学习,强化学习,混合学习)

1.是什么 基于数据寻找规律从而建立关系&#xff0c;进行升级&#xff0c;如果是以前的固定算式那就是符号学习了 2.基本框架 3.监督学习和无监督式学习&#xff1a; 监督学习&#xff1a;根据正确结果进行数据的训练&#xff1b; 在监督式学习中&#xff0c;训练数据包括输…

Python做自动化测试必知必会思维导图

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

标准IO函数-将bmp图片修改为德国国旗样式

代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h…

通过 Java 操作 redis -- String 基本命令

关于 redis String 类型的相关命令推荐看 Redis - String 字符串 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 本博客只介绍了一小部分常用的命令&#xff0c;其他的命令根据上面推荐的博客也能很简单…

选择器、pxcook软件、盒子模型

结构伪类选择器 定义&#xff1a;根据结构的元素关系来查找元素。 <title>Document</title><style>li:first-child{color:aqua ;}li:last-child{color: aqua;}li:nth-child(3){color: aqua;}</style> </head> <body><ul><li>…

雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 专注 从商业角度看&#xff0c;专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理&#xff0c;大家的第一反应可能是“风险会不会…

纯血鸿蒙APP实战开发——手写绘制及保存图片

介绍 本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能。手写板上完成绘制后&#xff0c;通过调用image库的packToFile和packing接口将手写板的绘制内容保存为图片&#xff0c;并将图片文件保存在应用沙箱路径中。 效果图预览 使用说明 在虚线区域手写…

“视频号小店”和“抖音小店”新手做电商选择哪个更好?

哈喽~我是电商月月 做电商的老商家和&#xff0c;准备做电商的新手朋友都知道现在最大的电商平台就是“抖音小店” 但抖店小店毕竟发展了四年&#xff0c;流量多&#xff0c;商家也多&#xff0c;最近又崛起了一个新黑马“视频号小店” 那到底去哪个平台发展才有前景呢&…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件&#xff0c;用于定义客户端的代理规则。您可以在 PAC 文件中编写规则&#xff0c;根据不同的目标网址或其他条件&#xff0c;决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上&#xff0c;并在客户端配置浏…

Day21 代码随想录打卡|字符串篇---右旋转字符串

题目&#xff08;卡码网 T55&#xff09;&#xff1a; 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转…

Material Studio 计算分子静电力、电荷密度以及差分电荷密度

1.先打开Material Studio导入要计算的分子cif文件或者mol文件&#xff0c;直接Flie-Import 2.高斯几何优化一下结构&#xff0c;参数按照我的设置就行&#xff0c;一般通用&#xff0c;后面出问题再调整 3.点完Run后会跳出很多计算过程&#xff0c;不用管&#xff0c;等他计算完…