我使用了以下源代碼并對其進行了一些修改,以獲得以下迷你示例: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_())這個想法是,通過單擊鼠標(biāo)左鍵創(chuàng)建新的矩形(這已經(jīng)有效)并通過單擊鼠標(biāo)右鍵刪除最近的矩形。我知道如何找到最近的矩形,但為此我需要現(xiàn)有矩形的坐標(biāo)。如果我們向場景添加一個新的矩形,我們將執(zhí)行以下操作:self.addRect(x, y, 100, 100)但是如果我迭代場景中的所有元素,并嘗試使用以下方法獲取元素的 x 坐標(biāo):? ? for elem in self.items():? ? ? ? print(elem.x())? ? ? ? print(elem.pos().x())? ? ? ? print(elem.scenePos().x())那么所有的打印輸出都為零。我已經(jīng)看過文檔,但據(jù)我了解,我正在按照文檔的建議進行操作。你知道我做錯了什么嗎?編輯:當(dāng)然,我可以將所有坐標(biāo)保存在附加列表中,使用該列表中的值計算最近的矩形,使用以下方法刪除每個矩形:? ? for elem in self.items():? ? ? ? self.removeItem(elem)并繪制剩余的矩形。不過,我希望有一個更干凈的版本。:)
1 回答

繁花不似錦
TA貢獻1851條經(jīng)驗 獲得超4個贊
正如文檔所解釋的:
請注意,項目的幾何形狀在項目坐標(biāo)中提供,并且其位置初始化為 (0, 0)。例如,如果添加 QRect(50, 50, 100, 100),則其左上角將位于相對于項目坐標(biāo)系中原點的 (50, 50) 處。
所以有兩個選擇:
在位置 (0, 0) 添加一個具有指定大小的矩形,然后將其移動到所需的位置:
????rectItem?=?self.addRect(0,?0,?100,?100) ????rectItem.setPos(x,?y)
使用 addRect 中的坐標(biāo)并根據(jù)矩形的左上角獲取實際位置:
????for?elem?in?self.items(): ????????pos?=?elem.pos()? ?????if?isinstance(elem,?QtWidgets.QGraphicsRectItem): ????????????pos?+=?elem.rect().topLeft()
添加回答
舉報
0/150
提交
取消