You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取QGraphicsScene中红矩形相对于蓝矩形的坐标?

获取QGraphicsItem间的相对坐标(红色矩形相对于蓝色矩形)

这个问题我之前也踩过坑,Qt的坐标映射方向很容易搞反,咱们一步步捋清楚怎么解决:

首先明确核心逻辑:要获取红色矩形(redItem)相对于蓝色矩形(blueItem)坐标系的坐标/矩形,本质是把redItem的局部坐标(或场景坐标)转换到blueItem的局部坐标系下。

方法一:通过场景坐标系中转(更直观)

这是最容易理解的方式,分两步走:

  1. 先把redItem的局部矩形转换为场景坐标系下的矩形:
QRectF redSceneRect = redItem->mapToScene(redItem->boundingRect()).boundingRect();

这里mapToScene()会把redItem自身坐标系的矩形转换为场景坐标,再用boundingRect()确保得到的是一个规整的矩形。

  1. 再把场景坐标系下的红色矩形,转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:34:19