为了账号安全,请及时绑定邮箱和手机立即绑定

PyQt5:GraphicsScene的所有项目的坐标都是0.0

PyQt5:GraphicsScene的所有项目的坐标都是0.0

PIPIONE 2023-07-27 16:25:15
我使用了以下源代码并对其进行了一些修改,以获得以下迷你示例:import sysfrom PyQt5 import QtCore, QtWidgetsclass GraphicsScene(QtWidgets.QGraphicsScene):    def __init__(self):        super(GraphicsScene, self).__init__()        self.setSceneRect(0, 0, 600, 400)    def mousePressEvent(self, event):        if event.buttons() == QtCore.Qt.LeftButton:            x = event.scenePos().x()            y = event.scenePos().y()            self.addRect(x, y, 100, 100)        elif event.buttons() == QtCore.Qt.RightButton:            for elem in self.items():                print(elem.x())        super(GraphicsScene, self).mousePressEvent(event)if __name__ == '__main__':    app = QtWidgets.QApplication(sys.argv)    scene = GraphicsScene()    w = QtWidgets.QGraphicsView(scene)    w.resize(610, 410)    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())那么所有的打印输出都为零。我已经看过文档,但据我了解,我正在按照文档的建议进行操作。你知道我做错了什么吗?编辑:当然,我可以将所有坐标保存在附加列表中,使用该列表中的值计算最近的矩形,使用以下方法删除每个矩形:    for elem in self.items():        self.removeItem(elem)并绘制剩余的矩形。不过,我希望有一个更干净的版本。:)
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

正如文档所解释的:

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

所以有两个选择:

  • 在位置 (0, 0) 添加一个具有指定大小的矩形,然后将其移动到所需的位置:

    rectItem = self.addRect(0, 0, 100, 100)
    rectItem.setPos(x, y)
  • 使用 addRect 中的坐标并根据矩形的左上角获取实际位置:

    for elem in self.items():
        pos = elem.pos() 
     if isinstance(elem, QtWidgets.QGraphicsRectItem):
            pos += elem.rect().topLeft()


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信