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

如何在QGraphicsScene中获取QGraphicsRectItem相对QGraphicsPixmapItem的坐标

问题解答:QGraphicsScene中获取QGraphicsRectItem相对QGraphicsPixmapItem坐标的最优方法

最优方案是直接使用Qt Graphics View框架原生的坐标映射接口,不需要手动处理旋转、位移、缩放等变换逻辑,所有计算由框架底层完成,准确率和性能都是最高的。


核心API说明

QGraphicsItem类内置的坐标转换方法会自动兼容所有几何变换(平移、旋转、缩放、剪切等),无需自行计算变换矩阵:

  • mapToItem(目标item, x, y):将当前item自身坐标系下的(x,y)点,转换为目标item坐标系下的坐标
  • mapFromItem(源item, x, y):将源item自身坐标系下的(x,y)点,转换为当前item坐标系下的坐标
    两种方法返回结果完全一致,可根据使用场景灵活选择。

代码实现步骤

  1. 先修改主窗口代码,将pixmap_item设为实例属性,方便后续调用:
# 主窗口__init__方法中修改pixmap创建逻辑
pixmap = QtGui.QPixmap("images/sadcat.jpg")
self.pixmap_item = self.scene.addPixmap(pixmap) # 加self前缀变为实例属性
self.pixmap_item.setPixmap(pixmap)
  1. 任意位置需要获取相对坐标时,直接调用API即可,示例:
# 示例1:获取矩形左上角相对pixmap的坐标
rect_top_left = self.rect.rect().topLeft()
pos_in_pixmap = self.rect.mapToItem(self.pixmap_item, rect_top_left)
print(f"左上角相对坐标:x={pos_in_pixmap.x()}, y={pos_in_pixmap.y()}")

# 示例2:获取矩形中心点相对pixmap的坐标
rect_center = self.rect.rect().center()
center_in_pixmap = self.rect.mapToItem(self.pixmap_item, rect_center)
print(f"中心点相对坐标:x={center_in_pixmap.x()}, y={center_in_pixmap.y()}")

# 等价写法:先转场景坐标再转pixmap本地坐标,结果和上面完全一致
rect_scene_pos = self.rect.mapToScene(rect_center)
center_in_pixmap = self.pixmap_item.mapFromScene(rect_scene_pos)

注意事项

不要直接用两个item的pos()值做差计算相对坐标,pos()返回的是item父坐标系下的坐标,不包含旋转、缩放等变换参数,在你当前有矩形旋转的场景下,直接计算得到的结果是完全错误的。

内容的提问来源于stack exchange,提问作者jon_bovi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:06:05