Я хочу разрешить перетаскивание QGraphicsItem
только в определенных направлениях, таких как +/- 45 градусов, по горизонтали или вертикали, и иметь возможность "прыгать" в новом направлении, когда курсор перемещается достаточно далеко от текущего ближайшего направления. Это будет повторять поведение, например, Inkscape при рисовании прямой линии и удерживании Ctrl
(см., Например, это видео ), но я не уверен, как это реализовать.
Я реализовал обработчик перетаскивания, который захватывает новую позицию элемента при его перемещении:
class Circle(QGraphicsEllipseItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Flags to allow dragging and tracking of dragging.
self.setFlag(self.ItemSendsGeometryChanges)
self.setFlag(self.ItemIsMovable)
self.setFlag(self.ItemIsSelectable)
def itemChange(self, change, value):
if change == self.ItemPositionChange and self.isSelected():
# do something...
# Return the new position to parent to have this item move there.
return super().itemChange(change, value)
Поскольку позиция, возвращаемая родителю этим методом, используется для обновления позиции элемента в сцене, я ожидаю, что могу изменить это значение QPointF
, чтобы ограничить его одной осью, но я не уверен, как это сделать. таким образом, что позволяет линии «прыгать» в другом направлении, когда курсор перемещается достаточно далеко. Существуют ли «стандартные алгоритмы» для такого поведения? Или, может быть, какой-то встроенный код Qt, который может сделать это для меня?