如何在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坐标系下的坐标
两种方法返回结果完全一致,可根据使用场景灵活选择。
代码实现步骤
- 先修改主窗口代码,将pixmap_item设为实例属性,方便后续调用:
# 主窗口__init__方法中修改pixmap创建逻辑 pixmap = QtGui.QPixmap("images/sadcat.jpg") self.pixmap_item = self.scene.addPixmap(pixmap) # 加self前缀变为实例属性 self.pixmap_item.setPixmap(pixmap)
- 任意位置需要获取相对坐标时,直接调用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
相关产品推荐
相关产品推荐

