Я пишу приложение Qt, основанное на QGraphicsScene
холст с подвижными формами на нем, и я пытаюсь интегрировать функцию отмены и возврата. Для большинства функций, таких как создание и удаление фигур, довольно просто реализовать QGraphicsScene
само по себе, но я хочу, чтобы элементы были подвижными и чтобы движение было необратимым. Прямо сейчас я использую резинку на сцене и ItemIsSelectable
а также ItemIsMovable
флаги на предметах. Проблема в том, что, кажется, нет хорошего места для создания QUndoCommand
представлять движение формы. Если я сделаю это в рамках QGraphicsScene::itemChange
В этом случае выбор и перемещение двух или более фигур приводит к тому, что отдельные команды отмены для разных объектов чередуются и, следовательно, не могут быть объединены, что приводит к неожиданному поведению. Там нет события в QGraphicsScene
это вызывается, когда его предметы перемещаются, что я вижу, так что я застрял.
В худшем случае я вижу, что я отключаю ItemIsMovable
флаг на мой заказ QGraphicsItem
объекты и обрабатывать движение полностью в QGraphicsScene
события мыши, но переопределение этой функциональности должным образом кажется довольно сложным (я проверил, как Qt делает это внутренне, и есть довольно много кода для обработки сложных случаев, таких как выбор объекта и некоторых его потомков). Это кажется наиболее очевидным из случаев использования стека отмены (настолько, что пример программы для структуры отмены является QGraphicsScene
программа очень похожа на мою, за исключением того, что она не поддерживает несколько движений объектов), поэтому кажется странным, что нет встроенного способа сделать это без переопределения значительной части основной функциональности. У кого-нибудь есть идеи или примеры программ, которые это делают?
Я решил, что это немного хакерски, я думаю. Я добавил preMovePoint
свойство моих пользовательских форм и в mousePressedEvent
из QGraphicsScene
Я установил preMovePoint
каждой из выбранных фигур в их соответствующие текущие позиции, и в mouseReleaseEvent
, создал составную команду перемещения из preMovePoint
к текущему pos
каждой формы. Мне все равно было бы интересно узнать, есть ли лучший способ.
Других решений пока нет …