Перемещение элементов в QGraphicsScene с столкновениямиPython

Программы на Python
Ответить
Anonymous
 Перемещение элементов в QGraphicsScene с столкновениями

Сообщение Anonymous »

Я пытаюсь переместить несколько или один выбранный элемент (прямоугольник) в QGraphicsView с обнаружением столкновений, чтобы они не перемещались друг через друга, а привязывались к любому концу, не блокируя движение по другой оси, вот код:

Код: Выделить всё

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Circle(QGraphicsRectItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.orgpos = None
self.lastpos = None

class Scene(QGraphicsScene):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
circ = Circle(0,0,100,50)
circ.setPos(500,500)
self.addItem(circ)
self.selected = [circ]
circ2 = Circle(0,0,100,50)
circ2.setPos(0,100)
self.addItem(circ2)

def mousePressEvent(self, event):
self.offset = event.scenePos()
for x in self.selected:
x.orgpos = x.pos()

def mouseMoveEvent(self, event):
for item in self.selected:
item.setPos(event.scenePos()-self.offset+item.orgpos)
if len(item.collidingItems(Qt.IntersectsItemShape))>0:
for x in self.selected:
x.setPos(x.lastpos)
break
item.lastpos = item.pos()

if __name__ == '__main__':
app = QApplication(sys.argv)
scene = Scene(0, 0, 1000, 800)
view = QGraphicsView(scene, renderHints=QPainter.Antialiasing)
view.show()
sys.exit(app.exec_())
Однако, как вы можете видеть, перетаскиваемый элемент (нижний) не перемещается по оси, которая не сталкивается, а просто останавливается, а также если пользователь перетаскивает достаточно быстро , он останавливается недалеко от сталкивающегося объекта. Есть ли способ решить эти две проблемы? Любая помощь приветствуется.
Код также использует список элементов и применяет одинаковое движение ко всем, поэтому в случае, если один элемент сталкивается и выбрано несколько, все они не перемещаются и оставайтесь вместе.

Подробнее здесь: https://stackoverflow.com/questions/791 ... collisions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»