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

如何获取加载图片的原始坐标而非显示区域坐标?

解决QGraphicsView中点击获取图片原始坐标的问题

我来帮你搞定这个坐标转换的问题!你遇到的错误其实是对Qt的坐标转换方法调用方式理解错了,咱们一步步来理清楚:

错误原因分析

你之前写的QGraphicsView.mapFromScene(event.pos())犯了两个小问题:

  1. 调用方式错误:mapFromScene是QGraphicsView的实例方法,必须用你当前的视图实例(比如self,如果你的类是继承自QGraphicsView的话)来调用,不能直接用类名QGraphicsView调用——这就是那个TypeError的根源。
  2. 转换方向搞反:你需要的是把「视图显示区域的坐标」转成「图片的原始坐标」,而mapFromScene是把场景坐标转成视图坐标,方向完全反了,应该用mapToScene先转场景坐标,再转图片局部坐标。

正确的坐标转换步骤

在QGraphicsView的体系里,坐标转换的链条是:
视图坐标(event.pos()) → 场景坐标 → 图片Item的局部原始坐标

具体来说,你需要做这几步:

  1. 把点击的视图坐标转换成场景坐标,用视图实例的mapToScene()方法
  2. 把场景坐标转换成图片Item自身的局部坐标(也就是图片的原始像素坐标),用图片Item的mapFromScene()方法

修正后的代码示例

假设你的图片是一个QGraphicsPixmapItem实例,存在self.pixmap_item变量里,你的类继承自QGraphicsView,那修正后的代码应该是这样:

# 1. 获取视图坐标并转换为场景坐标
scene_pos = self.mapToScene(event.pos())
# 2. 将场景坐标转换为图片自身的原始坐标
image_original_pos = self.pixmap_item.mapFromScene(scene_pos)
# 3. 发射信号,转成QPoint类型
self.photo_clicked.emit(QtCore.QPoint(image_original_pos.toPoint()))

额外注意点

如果你的场景里有多个Item,建议先判断点击的是不是目标图片Item,避免转换错误:

clicked_item = self.itemAt(event.pos())
if clicked_item == self.pixmap_item:
    scene_pos = self.mapToScene(event.pos())
    image_original_pos = self.pixmap_item.mapFromScene(scene_pos)
    self.photo_clicked.emit(QtCore.QPoint(image_original_pos.toPoint()))

这样不管图片怎么缩放、滚动,点击后得到的都是图片本身的原始像素坐标啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:44