Qt: Правильная интеграция фреймворка отмены с QGraphicsScene

Я пишу приложение Qt, основанное на QGraphicsScene холст с подвижными формами на нем, и я пытаюсь интегрировать функцию отмены и возврата. Для большинства функций, таких как создание и удаление фигур, довольно просто реализовать QGraphicsScene само по себе, но я хочу, чтобы элементы были подвижными и чтобы движение было необратимым. Прямо сейчас я использую резинку на сцене и ItemIsSelectable а также ItemIsMovable флаги на предметах. Проблема в том, что, кажется, нет хорошего места для создания QUndoCommand представлять движение формы. Если я сделаю это в рамках QGraphicsScene::itemChange В этом случае выбор и перемещение двух или более фигур приводит к тому, что отдельные команды отмены для разных объектов чередуются и, следовательно, не могут быть объединены, что приводит к неожиданному поведению. Там нет события в QGraphicsScene это вызывается, когда его предметы перемещаются, что я вижу, так что я застрял.

В худшем случае я вижу, что я отключаю ItemIsMovable флаг на мой заказ QGraphicsItem объекты и обрабатывать движение полностью в QGraphicsScene события мыши, но переопределение этой функциональности должным образом кажется довольно сложным (я проверил, как Qt делает это внутренне, и есть довольно много кода для обработки сложных случаев, таких как выбор объекта и некоторых его потомков). Это кажется наиболее очевидным из случаев использования стека отмены (настолько, что пример программы для структуры отмены является QGraphicsScene программа очень похожа на мою, за исключением того, что она не поддерживает несколько движений объектов), поэтому кажется странным, что нет встроенного способа сделать это без переопределения значительной части основной функциональности. У кого-нибудь есть идеи или примеры программ, которые это делают?

5

Решение

Я решил, что это немного хакерски, я думаю. Я добавил preMovePoint свойство моих пользовательских форм и в mousePressedEvent из QGraphicsSceneЯ установил preMovePoint каждой из выбранных фигур в их соответствующие текущие позиции, и в mouseReleaseEvent, создал составную команду перемещения из preMovePoint к текущему pos каждой формы. Мне все равно было бы интересно узнать, есть ли лучший способ.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]