Python PyQt5:Graphicscene的所有项都具有坐标0.0

Python PyQt5:Graphicscene的所有项都具有坐标0.0,python,pyqt,pyqt5,qgraphicsscene,Python,Pyqt,Pyqt5,Qgraphicsscene,我使用了以下内容并对其进行了一些修改,以获得以下小型示例: 导入系统 从PyQt5导入QtCore、QtWidgets 类graphicscene(qtwidts.qgraphicscene): 定义初始化(自): super(graphicscene,self)。\uuuu init\uuuuu() 自安装(0,0,600,400) def鼠标压力事件(自身、事件): 如果event.buttons()==QtCore.Qt.LeftButton: x=event.scenePos().x()

我使用了以下内容并对其进行了一些修改,以获得以下小型示例:

导入系统 从PyQt5导入QtCore、QtWidgets 类graphicscene(qtwidts.qgraphicscene): 定义初始化(自): super(graphicscene,self)。\uuuu init\uuuuu() 自安装(0,0,600,400) def鼠标压力事件(自身、事件): 如果event.buttons()==QtCore.Qt.LeftButton: x=event.scenePos().x() y=event.scenePos().y() self.addRect(x,y,100100) elif event.buttons()==QtCore.Qt.RightButton: 对于self.items()中的元素: 打印(elem.x()) 超级(graphicscene,self).mousePressEvent(事件) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=qtwidts.QApplication(sys.argv) 场景=graphicscene() w=QtWidgets.QGraphicsView(场景) w、 调整大小(610410) w、 show() sys.exit(app.exec_()) 其思想是,通过鼠标左键单击创建新的矩形(这已经起作用)并通过鼠标右键单击删除最近的矩形。我知道如何找到最近的矩形,但为此我需要现有矩形的坐标。如果将新矩形添加到场景中,我们将执行以下操作:

self.addRect(x, y, 100, 100)
但如果我迭代场景中的所有元素,并尝试使用以下方法获取元素的x坐标:

    for elem in self.items():
        print(elem.x())
        print(elem.pos().x())
        print(elem.scenePos().x())
然后所有打印输出都为零。我已经看过了,但据我所知,我正在做docu推荐的事情。你知道我做错了什么吗


编辑: 当然,我可以将所有坐标保存在一个附加列表中,使用该列表中的值计算最近的矩形,使用以下命令删除每个矩形:

    for elem in self.items():
        self.removeItem(elem)
并绘制剩余的矩形。但是,我希望有一个更干净的版本

作为:

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

因此有两种选择:

  • 添加具有指定大小但位于位置(0,0)的矩形,然后将其移动到所需位置:
  • 使用addRect中的坐标并根据矩形的左上角获取实际位置:
作为:

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

因此有两种选择:

  • 添加具有指定大小但位于位置(0,0)的矩形,然后将其移动到所需位置:
  • 使用addRect中的坐标并根据矩形的左上角获取实际位置:
    rectItem = self.addRect(0, 0, 100, 100)
    rectItem.setPos(x, y)
    for elem in self.items():
        pos = elem.pos()
        if isinstance(elem, QtWidgets.QGraphicsRectItem):
            pos += elem.rect().topLeft()