PyQt5中QGraphicsScene调用setRect移动矩形时原点异常问题咨询
QGraphicsRectItem移动后scenePos不更新的问题解决
嘿,我一眼就看出问题出在哪了——你搞混了QGraphicsRectItem里setRect()和setPos()的作用啦!
问题根源
setRect()是用来设置图形项自身局部坐标系里的矩形范围,简单说就是这个矩形“自己内部”的形状位置,它根本不会改变这个图形项在QGraphicsScene全局坐标系中的位置。你一开始在(0,0)创建矩形,其实是在图形项的局部坐标里画了个从(0,0)开始的矩形,之后调用setRect(x,y,w,h)只是把这个局部矩形的起点改了,但图形项在场景里的“锚点”位置还是原来的(0,0),所以scenePos()返回的自然还是初始位置。- 而鼠标拖动时,Qt内部是自动调用了
setPos()来改变图形项在场景中的全局位置,所以scenePos()能正确返回新的坐标。
修复方案
把你的move函数里的setRect改成setPos就搞定了:
def move(self, x, y): """Moves the object in the editor view to coordinate x,y""" self.rect.setPos(x, y)
这个方法会直接修改图形项在场景中的全局位置,之后调用getPos()获取scenePos()就能得到正确的(x,y)了。
额外说明
如果你的需求是既要调整图形项自身的形状(比如改变矩形的起点、宽高),又要移动它在场景中的位置,那可以分开操作:
- 用
setRect()调整局部形状(比如self.rect.setRect(0, 0, self.width, self.height)保持局部起点为0,0) - 用
setPos(x,y)移动它在场景中的位置
这样两者的职责就清晰了,不会再出现位置获取错误的情况。
内容的提问来源于stack exchange,提问作者cooldanietje
相关产品推荐
相关产品推荐

