Как получить события перемещения элемента отчета QGraphicsScene

StackOverflow https://stackoverflow.com/questions/2006433

  •  18-09-2019
  •  | 
  •  

Вопрос

QT's QGraphicsScene предоставляет несколько хороших функций из коробки:пользователь может выбирать объекты и перемещать их.

Я хочу еще одну вещь - получать уведомления, когда пользователь закончил перемещать объект.Существуют события более низкого уровня, такие как перемещение мыши, нажатие, отпускание, но я бы не хотел переопределять уже существующую функциональность (перемещение объектов).

А http://doc.trolltech.com/4.2/qgraphicsitem.html#itemChange Метод выглядит так, но он НЕ вызывается, когда пользователь перемещает объект.

Я использую Qt 4.6

Оказывается, вам нужно установить флаг, чтобы включить это событие:item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);

Но теперь событие запускается каждый раз, когда изменяются координаты элемента.Я хочу, чтобы событие происходило только тогда, когда изменение выполняется пользователем.

Это было полезно?

Решение

Я думаю, что лучший способ — реализовать событие mouseRelease для ваших элементов: когда оно будет запущено, вы сможете узнать, был ли элемент перемещен или нет.Если элемент был перемещен, примите событие, иначе отправьте событие в базовый класс.

Например:

 void YourItem::mouseReleaseEvent(QMouseEvent *event)
 {
     if (wasMoved()) {
         //do something and accept the event
     } else {
         // to the base class
         QGraphicsItem::mouseReleaseEvent(event);
     }
 }

WasMoved() — ваш метод узнать, был ли перемещен элемент.

Другие советы

За исключением того, что это не может работать всегда, поскольку вы не всегда получаете событие mouseReleaseEvent...

Однако код, выполняющий перетаскивание, блокирует код, поэтому вы можете поместить его туда, поскольку код продолжит работу только после того, как вы отпустите кнопку мыши, и он всегда работает...(QT 4.7+)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top