QGraphics View坐标系
QGraphics View绘图结构依赖三个类:QGraphicsScene,QGraphicsView,QGraphicsItem。
这三者的关系在前面已经介绍过:Graphics View 绘图架构-CSDN博客
这里介绍下这三者的坐标系,以及如何相互转换。
1. QGraphicsScene 坐标系
描述: QGraphicsScene
使用的是场景坐标系,这是一个笛卡尔坐标系,其中 (0, 0) 通常是场景的左上角。
用途: 用于确定图形项在场景中的位置。
范围: 场景坐标系可以非常大,支持大量的图形项。
2. QGraphicsView 坐标系
描述: QGraphicsView
使用的是视图坐标系,这也是一个笛卡尔坐标系,其中 (0, 0) 通常是视图的左上角。
用途: 用于确定用户在视图中的操作位置,如鼠标点击、拖动等。
范围: 视图坐标系通常与视图的大小一致,但可以通过缩放和平移操作改变。
3. QGraphicsItem 坐标系
描述: QGraphicsItem
使用的是本地坐标系,其中 (0, 0) 通常是图形项的局部原点。这个原点的具体位置取决于图形项的类型和构造方式。以下是一些常见图形项的默认原点位置:
- QGraphicsRectItem(0, 0, 100, 100); // 创建的矩形,其左上角在 (0, 0),右下角在 (100, 100)。
- QGraphicsEllipseItem(0, 0, 100, 100); // 创建的椭圆,其左上角在 (0, 0),右下角在 (100, 100)。
- QGraphicsPolygonItem; // (0, 0) 是多边形的第一个顶点。
- QGraphicsPathItem; // (0, 0) 是路径的起始点。
- 自定义的
QGraphicsItem,
对于自定义的QGraphicsItem
,(0, 0) 的位置完全由你在重写的boundingRect
和paint
方法中定义。
用途: 用于确定图形项内部的细节,如子项的位置、形状等。
范围: 本地坐标系通常与图形项的大小一致,但可以有更复杂的变换(如旋转、缩放)。
4. 三者坐标之间的相互转换
鼠标事件的传递方向是:视图view -> 场景scene -> 图元item。详情可参考之前的博文 Graphics View 绘图架构-CSDN博客
所以这里将关注的转换路径:视图view坐标 -> 场景scene坐标 -> 图元item坐标
这些坐标的变换都是通过两端对象的方法控制,要么是view对象,要么是item对象。
4.1 视图坐标和场景坐标
通过view控制
(1)视图坐标 -> 场景坐标系: QPointF scenePos = view->mapToScene(viewPos);
(2)场景坐标 -> 视图坐标系: QPoint viewPos = view->mapFromScene(scenePos);
4.2 场景坐标系和图形项坐标
通过item控制
(1)场景坐标 -> 图形项的本地坐标系:QPointF itemPos = item->mapFromScene(scenePos);
(2)图形项的本地坐标 -> 场景坐标系: QPointF scenePos = item->mapToScene(itemPos);
4.3 视图坐标和图形项坐标
中间都要经过场景坐标。
(1)视图坐标 -> 图形项的本地坐标系:
QPointF scenePos = view->mapToScene(viewPos);
QPointF itemPos = item->mapFromScene(scenePos);
(2)图形项的本地坐标 -> 视图坐标系
QPointF scenePos = item->mapToScene(itemPos);
QPoint viewPos = view->mapFromScene(scenePos);