itemChanged никогда не вызывается в QGraphicsItem - PullRequest
2 голосов
/ 18 ноября 2011

В этом примере: http://www.java2s.com/Code/Cpp/Qt/InteractwithQGraphicsItem.htm

Функция itemChange () - это место, где выполняется вся работа по обновлению. Однако эта функция, кажется, не вызывается, когда я перемещаю ручки. По:

http://doc.qt.io/qt-4.8/qgraphicsitem.html#itemChange

он должен вызываться всякий раз, когда изменяется состояние, которое, я бы предположил, включало бы позицию. Кто-нибудь может объяснить, как заставить эту функцию вызываться при перемещении маркеров?

1 Ответ

6 голосов
/ 18 ноября 2011

Из документации qt отметьте QGraphicsItem::ItemPositionChange:

Позиция предмета меняется. Это уведомление отправляется, если ItemSendsGeometryChanges флаг включен, и когда элемент локальный изменение положения относительно своего родителя (т.е. в результате вызова setPos() или moveBy()). Значением аргумента является новая позиция (т.е. QPointF). Вы можете позвонить pos(), чтобы получить исходную позицию. Не звоните setPos() или moveBy() в itemChange(), поскольку это уведомление поставлено; вместо этого вы можете вернуть новую, настроенную позицию из itemChange(). После этого уведомления QGraphicsItem немедленно отправляет ItemPositionHasChanged уведомление, если позиция изменилась.

Таким образом, вы должны включить флаг QGraphicsItem::ItemSendsGeometryChanges, чтобы вызывать itemChange при изменении позиции.

По умолчанию это отключено для оптимизации :

Из соображений производительности эти уведомления по умолчанию отключены. Вы должны включить этот флаг, чтобы получать уведомления о позиции и изменения трансформации. Этот флаг был введен в Qt 4.6.

Чтобы установить флаг, вы должны вызвать функцию setFlag предпочтительно в конструкторе вашего пользовательского элемента.

item->setFlag(GraphicsItem::ItemSendsGeometryChanges);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...