
QGeoView 的底层就是 Qt 的QGraphicsView / QGraphicsScene / QGraphicsItem框架即 Qt 的 Graphics View Framework。具体关系QGeoView 的封装层 Qt 底层 ───────────────── ───────────────────── QGVMap (QWidget) → QGraphicsView QGVCamera → QGraphicsView 的变换矩阵 场景坐标 QGVItem → QGraphicsItem场景中的图元 QGVDrawItem → 自定义 QGraphicsItem重写 paint QGVLayer → QGraphicsItem 分组父图元 QGVWidget → QGraphicsWidget场景中的控件 QGVProjection → 坐标转换地理坐标 ↔ 投影坐标 ↔ 场景坐标QGraphicsView 是什么它是 Qt 提供的一个二维场景-视图框架核心思想是┌─────────────────────────────────────────┐ │ QGraphicsView (视图/窗口) │ │ ┌─────────────────────────────────── │ │ │ QGraphicsScene (场景/画布) │ │ │ │ │ │ │ │ ┌────┐ ────┐ ┌──────────┐ │ │ │ │ │Item│ │Item│ │ Item │ │ │ │ │ └────┘ └────┘ └──────────┘ │ │ │ │ │ │ │ └───────────────────────────────────┘ │ │ 支持缩放、平移、旋转、碰撞检测、选择 │ └─────────────────────────────────────────┘QGraphicsScene一个无限大的二维画布所有图元Item放在这里QGraphicsView一个窗口显示 Scene 的一部分负责渲染和用户交互QGraphicsItemScene 中的图元可以嵌套形成树形结构QGeoView 做了什么封装Qt 的 QGraphicsView 是通用的 2D 框架不懂地理坐标。QGeoView 在它之上加了一层地理语义QGraphicsView 原生能力QGeoView 增加的地理能力场景坐标像素/逻辑单位地理坐标经纬度 投影坐标↔ 场景坐标的三层转换缩放 改变 view 的 transform缩放 改变地图比例尺联动瓦片层级平移 拖动 view平移 改变地图中心点联动瓦片加载旋转 旋转 view 的 transform旋转 改变地图方位角azimuth普通 QGraphicsItemQGVItem支持地理边界、投影回调、选择/悬停语义无瓦片概念QGVLayerTiles按需计算、下载、缓存瓦片为什么要基于 QGraphicsView渲染能力强— 支持大量图元、反走样、透明度、变换交互完善— 鼠标事件、拖拽、选择、碰撞检测都是现成的Qt 原生— 和 Qt 应用无缝集成不需要额外的渲染后端性能够用— 对于二维地图场景QGraphicsView 配合合理的视口裁剪完全够用这个架构的局限QGraphicsView是 CPU 渲染的当图元数量非常大比如几万个时会有性能瓶颈。这也是 QGeoView 的performance示例和10000示例在探讨的问题。如果需要 GPU 加速渲染大量矢量数据可能需要换到OpenGL/Vulkan方案比如 Mapbox GL Native 或 osgEarth。但对于常规的二维地图应用瓦片底图 几百到几千个业务图元QGraphicsView 完全够用。