我正在编写一个基于QGraphicsScene
带有可移动形状的画布的 Qt 应用程序,并且我正在尝试集成撤消重做功能。对于大多数功能,例如创建和删除形状,在其QGraphicsScene
自身上实现相当简单,但我希望元素是可移动的并且移动是可撤销的。现在我在场景中使用橡皮筋拖动模式,在项目上使用ItemIsSelectable
和ItemIsMovable
标志。问题是似乎没有好地方来创建QUndoCommand
表示形状运动的。如果我在QGraphicsScene::itemChange
方法中执行此操作,则选择和移动两个或多个形状会导致不同对象的单独撤消命令交错,因此无法合并,因此撤消会导致意外行为。中没有事件QGraphicsScene
当我可以看到它的项目四处移动时会调用它,所以我有点卡住了。
我看到的最坏情况是我禁用了ItemIsMovable
自定义对象上的标志QGraphicsItem
并完全在QGraphicsScene
鼠标事件中处理移动,但是正确地重新实现该功能似乎相当复杂(我检查了 Qt 在内部是如何做到的,并且有很多代码用于处理复杂的情况,例如同时选择一个对象及其一些子对象)。这似乎是撤消堆栈最明显的用例(以至于撤消框架的示例程序QGraphicsScene
与我的程序非常相似,只是没有多对象移动支持)所以没有内置方法似乎很奇怪在不重新实现核心功能的重要部分的情况下做到这一点。有没有人对这样做的程序有任何见解或示例?