<p>您忘记了图形项目的一个重要方面:它们的[场景]位置并不总是实际显示给用户的对象的左上角。
在使用<code>scene.add*()</code>添加项目时,这一点很清楚(这已在<a href="https://stackoverflow.com/questions/63851295/pyqt5-all-items-of-graphicsscene-have-coordinates-0-0">this question</a>中进行了解释)。<br/>
作为<a href="https://doc.qt.io/qt-5/qgraphicsscene.html#addRect" rel="nofollow noreferrer">documentation explains</a>:</p>
<blockquote>
<p>Note that the item's geometry is provided in item coordinates, and <strong>its position is initialized to (0, 0)</strong>. For example, if a QRect(50, 50, 100, 100) is added, its top-left corner will be at (50, 50) relative to the origin in the item's coordinate system.</p>
</blockquote>
<p><em>项</em>位置不是<em>矩形</em>位置,因此当您使用<code>setRect</code>时,您不会移动项,而是在指定位置设置新矩形,同时将项保留在其系统的(0,0)坐标处;注意,这也意味着如果该项没有父项,<code>scenePos()</code>将与<code>pos()</code>相同,否则它是相对于父项的</p>
<p>如果要知道矩形左上角的实际位置,可以使用以下选项之一:</p>
<ul>
<li><code>item.sceneBoundingRect().topLeft()</code></li>
<li><code>item.scenePos() + item.rect().topLeft()</code></li>
</ul>
<p>如果总是在(0,0)处添加矩形,则可以只使用<code>setPos()</code>,但是如果需要基于当前实际矩形位置计算位置,则必须使用上述函数之一</p>
<p>请注意,矩形的大小也可以为负数,因此如果需要<em>可见</em>矩形的左上角,则需要<a href="https://doc.qt.io/qt-5/qrect.html#normalized" rel="nofollow noreferrer">normalize</a>它:</p>
<pre><code> item.scenePos() + item.rect().normalized().topLeft()
</code></pre>