如何获取QGraphicsScene中红矩形相对于蓝矩形的坐标?
获取QGraphicsItem间的相对坐标(红色矩形相对于蓝色矩形)
这个问题我之前也踩过坑,Qt的坐标映射方向很容易搞反,咱们一步步捋清楚怎么解决:
首先明确核心逻辑:要获取红色矩形(redItem)相对于蓝色矩形(blueItem)坐标系的坐标/矩形,本质是把redItem的局部坐标(或场景坐标)转换到blueItem的局部坐标系下。
方法一:通过场景坐标系中转(更直观)
这是最容易理解的方式,分两步走:
- 先把redItem的局部矩形转换为场景坐标系下的矩形:
QRectF redSceneRect = redItem->mapToScene(redItem->boundingRect()).boundingRect();
这里mapToScene()会把redItem自身坐标系的矩形转换为场景坐标,再用boundingRect()确保得到的是一个规整的矩形。
- 再把场景坐标系下的红色矩形,转换为blueItem的局部坐标系:
QRectF redRelativeToBlue = blueItem->mapRectFromScene(redSceneRect);
这样得到的redRelativeToBlue就是红色矩形在蓝色矩形坐标系中的位置和大小了。
方法二:直接跨Item映射(更高效)
Qt提供了直接在两个Item间映射坐标的方法,省去中转场景的步骤:
QRectF redRelativeToBlue = blueItem->mapRectFromItem(redItem, redItem->boundingRect());
这里mapRectFromItem()的第一个参数是源Item(redItem),第二个参数是源Item局部坐标系下的矩形,方法会直接把这个矩形转换到当前Item(blueItem)的局部坐标系中。
为什么你之前用mapRectFromScene没得到预期结果?
大概率是搞反了映射的方向:
- 如果用
redItem->mapRectFromScene(...),那是把场景坐标转换为redItem的局部坐标,和你要的“red相对于blue”完全相反; - 必须以blueItem为主体,调用它的
mapRectFromScene或mapRectFromItem,才能得到red在blue坐标系下的结果。
注意事项
- 确保两个Item都已经添加到
QGraphicsScene中,并且场景已经完成布局(比如调用过scene->update()或者Item已经完成初始化),否则映射结果可能不准确; - 如果是自定义的
QGraphicsItem,一定要正确重写boundingRect()方法,返回的矩形要准确包含Item的所有内容,否则映射的范围会出错。
内容的提问来源于stack exchange,提问作者Sayan Bera
相关产品推荐
相关产品推荐

