如何获取加载图片的原始坐标而非显示区域坐标?
解决QGraphicsView中点击获取图片原始坐标的问题
我来帮你搞定这个坐标转换的问题!你遇到的错误其实是对Qt的坐标转换方法调用方式理解错了,咱们一步步来理清楚:
错误原因分析
你之前写的QGraphicsView.mapFromScene(event.pos())犯了两个小问题:
- 调用方式错误:
mapFromScene是QGraphicsView的实例方法,必须用你当前的视图实例(比如self,如果你的类是继承自QGraphicsView的话)来调用,不能直接用类名QGraphicsView调用——这就是那个TypeError的根源。 - 转换方向搞反:你需要的是把「视图显示区域的坐标」转成「图片的原始坐标」,而
mapFromScene是把场景坐标转成视图坐标,方向完全反了,应该用mapToScene先转场景坐标,再转图片局部坐标。
正确的坐标转换步骤
在QGraphicsView的体系里,坐标转换的链条是:视图坐标(event.pos()) → 场景坐标 → 图片Item的局部原始坐标
具体来说,你需要做这几步:
- 把点击的视图坐标转换成场景坐标,用视图实例的
mapToScene()方法 - 把场景坐标转换成图片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
相关产品推荐
相关产品推荐

