Qt: QGraphicsView二维图形绘图框架
坐标
主要坐标包含三类:
QGraphicsView坐标: 视图坐标,即显示窗口的坐标,和屏幕尺寸是1:1
QGraphicsScene坐标: 场景坐标,被观察场景的坐标,通过缩放和平移比例可以转换为视图坐标
QGraphicsItem坐标: 图形项坐标,每一个图形项都有一个自己的坐标系,有可能是这个图形项的左上角也可能是中心。由这个图形项的boundingRect()定义
以上三个坐标系相互独立。可以通过trans()转换矩阵进行转换。
坐标转换:
视图到场景:view->mapToScene(QPoint);//这里注意视图坐标是int型,对应屏幕的像素
场景到视图:view->mapFromScene(QPointF);//场景坐标是double,可以有亚像素
场景到图形项:QPointF QGraphicsItem::mapFromScene(qreal ax, qreal ay)。item->mapFromScene(scene_pos);//讲一个场景的坐标转换到图形项坐标系下
图形项到场景:QPointF QGraphicsItem::mapToScene(qreal ax, qreal ay)。item->mapToScene(item_pos);将图形项的坐标转换为场景坐标
坐标设置和获取
- 设置:推荐使用setPos()
使用 setPos() 方法 该方法用于设置 QGraphicsItem 在其父项坐标系中的位置;默认直接添加在场景中的图形项设置的就是item在场景中的坐标;
item->setPos(x, y); // 设置左上角坐标为 (x, y)
使用 setRect() 方法(对于 QGraphicsRectItem) 如果你使用的是 QGraphicsRectItem,可以通过 setRect() 同时设置位置和大小
rectItem->setRect(x, y, width, height); // 设置位置和大小;这里设置的位置坐标系是rectItem的坐标系,
//不过改变rectItem在scene下的坐标。但是这里设置后再显示效果上和setPos()是一样的
- 获取:推荐使用scenePos()。
使用 pos() 方法 该方法返回 QGraphicsItem 在其父项坐标系中的位置
QPointF position = item->pos();//若item已经添加在场景中,则pos和scenePos相同
使用 scenePos() 方法 该方法返回 QGraphicsItem 在场景坐标系中的绝对位置。
QPointF scenePosition = item->scenePos();
示例1:获取鼠标所在的位置是否在某一个QGraphicsRectItem中
QPoint view_pos = event->pos();//从事件中获取鼠标的view坐标
QPointF scene_pos = this->mapToScene(view_pos);//view坐标转换为scene坐标
QPointF rect_pos = rect_item->mapFromScene(scene_pos );//将scene坐标转换为item坐标系下的坐标
rect_item->contains(rect_pos);//使用rect的contains函数进行判断