0

我正在制作一个具有图形场景的应用程序,您可以在其中拖动项目并在场景中移动它们。

我试图防止场景中的项目之间的勾结,并看到了这个问题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()
4

0 回答 0