PyQT5 setRect在QGraphicsScene中移动原点

问题描述

每当我尝试在场景中移动矩形时,矩形的原点似乎都会更改为矩形在更新位置之前的位置。

因此,如果我在(0,0)处创建矩形并使用rect.setRect(x,y)将其移动,则返回位置将产生(0,0)而不是(x,y)。

如果要使用鼠标在QGraphicsScene中移动它,它将返回正确的(x,y)。

我用来创建矩形的代码如下:

class placeableObject:
    def __init__(self,index,scene,QPen,QBrush,width=100,height=100):
        """Parent class for placeable objects"""
        self.width = float(width)
        self.height = float(height)
        self.index = index

        self.rect = scene.addRect(0,int(width),int(height),QBrush)
        self.rect.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)

要移动此矩形,我具有以下嵌入式函数一个返回位置的函数

def getPos(self):
    """Returns a list with the x,y position of the object in the scene"""
    return [self.rect.scenePos().x(),self.rect.scenePos().y()]

def move(self,x,y):
    """Moves the object in the editor view to coordinatex x,y"""
    self.rect.setRect(x,y,self.width,self.height)

解决方法

您忘记了图形项的一个重要方面:它们的[场景]位置并不总是实际显示给用户的对象的左上角。 使用scene.add*()添加项目时,这一点很明显(这已经在this question中进行了说明)。
作为documentation explains

请注意,物品的几何形状在物品坐标中提供,并且其位置被初始化为(0,0)。例如,如果添加了QRect(50,50,100,100),则其左上角将相对于项目坐标系中的原点位于(50,50)。

item 位置不是 rectangle 位置,因此,当您使用setRect时,您不会移动该项目,而是在指定位置设置了一个新矩形位置,同时将项目保留在其系统的(0,0)坐标处;请注意,这也意味着,如果该项没有父项,则scenePos()pos()相同,否则它是相对于父项的。

如果您想知道矩形左上角的实际位置,可以使用以下方法之一:

  • item.sceneBoundingRect().topLeft()
  • item.scenePos() + item.rect().topLeft()

如果始终将矩形添加在(0,0)处,则可以使用setPos(),但是如果需要根据当前的实际矩形位置计算位置,则必须使用一个上面的功能。

请注意,矩形也可以具有负数大小,因此,如果需要可见矩形的左上角,则需要normalize

    item.scenePos() + item.rect().normalized().topLeft()
,

看来我已经弄清楚了。

我将移动功能更改为以下内容:

def move(self,x,y):
    """Moves the object in the editor view to coordinatex x,y"""
    self.rect.setPos(x,y)

为我返回场景中的正确位置! 无论如何,谢谢:)