我正在制作一个具有图形场景的应用程序,您可以在其中拖动项目并在场景中移动它们。
我试图防止场景中的项目之间的勾结,并看到了这个问题Prohibit collision of a可移动的 QGraphicsItem 与其他对我来说效果不佳的项目(可能是因为我使用的是 PyQt6 并且从 qt 翻译得不是很好)。
我正在使用 QGraphicsEllipseItem 和 QGraphicsRectItem 但 QGraphicsEllipseItem 的每个解决方案都会有很大帮助。
我知道我只需要在发生碰撞的轴上阻止运动,但我没有设法实现它。我试图通过项目正在碰撞的项目列表来处理 quth multipule collusions。
我正在使用 PyQt6,但任何事情都会有所帮助
以下是我尝试解决的方法:
from PyQt6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsEllipseItem, QGraphicsItem
from PyQt6 import QtCore
import typing
class Item(QGraphicsEllipseItem):
def __init__(self, geo):
super().__init__(geo)
self.setFlag(self.GraphicsItemFlag.ItemIsMovable)
self.setFlag(self.GraphicsItemFlag.ItemSendsGeometryChanges)
def itemChange(self, change: 'QGraphicsItem.GraphicsItemChange', value: typing.Any) -> typing.Any:
c = super().itemChange(change, value)
if change == QGraphicsItem.GraphicsItemChange.ItemPositionChange:
for collide in self.collidingItems(QtCore.Qt.ItemSelectionMode.IntersectsShape):
if :#from the right
c.setX()#keep on the right
elif :#from the left
c.setX() #keep on the left
if :#from above
c.setY() # keep above
elif :#from below
c.setY() #keep below
return c
app = QApplication([])
view = QGraphicsView()
s = QGraphicsScene()
s.addItem(Item(QtCore.QRectF(50, 50, 50, 50)))
s.addItem(Item(QtCore.QRectF(200, 200, 50, 50)))
view.setScene(s)
view.show()
app.exec()