アイテムをドラッグしてシーン内で移動できるグラフィックシーンを持つアプリを作成しています。
シーン内のアイテム間の共謀を防止しようとしていますが、この質問Prohibit collision of a moving QGraphicsItem with other itemsがうまく機能しませんでした (おそらく、PyQt6 を使用していて、qt からの変換がうまくいかなかったためです)。
QGraphicsEllipseItem と QGraphicsRectItem を使用していますが、QGraphicsEllipseItem のすべてのソリューションが非常に役立ちます。
衝突が発生する軸でのみ動きをブロックする必要があることを理解しましたが、それを実装することができませんでした。複数の共謀に対処するために、アイテムが衝突しているアイテムのリストを調べてみました。
私は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()