Python PyQt:使用setRect()控制QGraphicsRectItem的位置

Python PyQt:使用setRect()控制QGraphicsRectItem的位置,python,pyqt,Python,Pyqt,我第一次尝试PyQT,是为了最终创建一些数据的基本图形表示。 我目前正在尝试在QGraphicsRectItem中框选两个QGraphicsTextItem,我对看到的一些结果有一些疑问 class MyRect(QGraphicsRectItem): def __init__(self, parent = None): super(MyRect, self).__init__(parent) self.text_item = QGraphicsTe

我第一次尝试PyQT,是为了最终创建一些数据的基本图形表示。
我目前正在尝试在
QGraphicsRectItem
中框选两个
QGraphicsTextItem
,我对看到的一些结果有一些疑问

class MyRect(QGraphicsRectItem):

    def __init__(self, parent = None):
        super(MyRect, self).__init__(parent)

        self.text_item  = QGraphicsTextItem('My Text Here', self)
        self.value_item = QGraphicsTextItem('My Value Here', self)
        self.text_item.setDefaultTextColor(QColor(Qt.blue))
        self.value_item.setDefaultTextColor(QColor(Qt.red))

        self.value_item.setPos(self.text_item.boundingRect().bottomLeft())

        width  = max(self.text_item.boundingRect().width(), self.value_item.boundingRect().width())
        height = self.text_item.boundingRect().height() + self.value_item.boundingRect().height()
        self.setRect(50, 50, width, height)


class MainFrame(QDialog):

    def __init__(self, parent = None):
        super(MainFrame, self).__init__(parent)

        ### setting up the scene
        self.view = QGraphicsView()
        self.scene = QGraphicsScene(self)
        self.view.setScene(self.scene)
        self.scene.setSceneRect(0, 0, 500, 500)

        ### setting up MyRect
        my_rect = MyRect()

        self.scene.addItem(my_rect)

        layout = QHBoxLayout()
        layout.addWidget(self.view)
        self.setLayout(layout)

        self.setWindowTitle("Basic test")
上述情况产生了以下结果:

这不是我想要的。
经过更多的实验,我发现改变这一点:

self.setRect(50, 50, width, height)
为此:

self.setRect(0, 0, width, height)
self.setPos(50, 50)
成功了:

怎么会?
使用
setRect()
设置矩形的位置与使用
setPos()
显式设置位置之间有什么区别

不同之处在于函数是根据不同的坐标系定义的。根据文档,
setPos()
定义了矩形在其父坐标系统中的位置,而
setRect()
定义了矩形在其自身局部坐标系统中的位置和大小。因此
setPos()
(x,y)
setRect()
(x,y)
没有相同的含义


使用
setPos(50,50)
,您的意思是矩形局部坐标系的原点位于
(50,50)
位置,在
qgraphicscene
的坐标系中(其父坐标系)。然后使用
setRect(0,0,宽度,高度)
,你说矩形位于原点
(0,0)
,在它自己的坐标系中(实际上是场景坐标系中的
(50,50)
)。

这是一个老生常谈的问题,但它可能会帮助某些人。我自己也在学习PyQt,最近也遇到了同样的问题。