簡體   English   中英

PyQT5 setRect 在 QGraphicsScene 中移動原點

[英]PyQT5 setRect moves origin point in a 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, 0, int(width), int(height), QPen, 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*()添加項目時很清楚(這已經在這個問題上解釋過了)。
正如文檔解釋的那樣

請注意,項目的幾何形狀在項目坐標中提供,其位置初始化為 (0, 0) 例如,如果添加了 QRect(50, 50, 100, 100),則其左上角將位於相對於項目坐標系中的原點的 (50, 50) 處。

item 的位置不是矩形的位置,所以當你使用setRect你不是在移動 item,而是在指定的位置設置一個新的矩形,同時將 item 留在其系統的 (0, 0) 坐標處; 請注意,這也意味着如果項目沒有父項,則scenePos()將與pos()相同,否則它是相對於父項的。

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

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

如果您總是在 (0, 0) 處添加矩形,那么您可以只使用setPos() ,但如果您需要根據當前的實際矩形位置計算位置,則必須使用上述函數之一。

請注意,矩形也可以具有負大小,因此如果您需要可見矩形的左上角,則需要對其進行標准化

    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)

這為我返回了場景中的正確位置! 不管怎么說,還是要謝謝你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM