Qt:正确地将undo框架与QGraphicsScene集成

Sim*_*ead 5 c++ qt undo qgraphicsscene

我正在编写一个基于QGraphicsScene画布的Qt应用程序,其上有可移动的形状,我正在尝试集成undo-redo功能.对于大多数函数,比如创建和删除形状,在它QGraphicsScene自身上实现它是相当简单的,但我希望元素是可移动的,并且运动是可撤销的.现在我正在使用场景上的橡皮筋拖曳模式ItemIsSelectableItemIsMovable项目上的标志.问题是,似乎没有好的地方来创建QUndoCommand表示形状运动.如果我在QGraphicsScene::itemChange方法中执行此操作,则选择并移动两个或更多个形状会导致不同对象的单独撤消命令被交错,因此无法合并,因此撤消会导致意外行为.QGraphicsScene当它的项目被移动时,没有任何事件被调用,我可以看到,所以我有点卡住了.

我看到的最糟糕的情况是我ItemIsMovable在自定义QGraphicsItem对象上禁用了标志并完全在QGraphicsScene鼠标事件中处理移动,但正确地重新实现该功能似乎相当复杂(我检查了Qt如何在内部执行它并且有很多代码用于处理复杂的情况,例如选择对象及其某些子对象的情况.这似乎是撤销堆栈最明显的用例(以至于撤消框架的示例程序QGraphicsScene与我的程序非常相似,除非没有多个对象移动支持)所以看起来很奇怪没有内置的方式在没有重新实现核心功能的重要部分的情况下做到这一点.有没有人有任何见解或程序的例子这样做?

Sim*_*ead 6

我认为我有点笨拙地解决了这个问题。我添加了一个preMovePoint属性,以我的自定义形状和在mousePressedEventQGraphicsScene,我设定preMovePoint每个选定的形状,以它们各自的当前位置的,并在mouseReleaseEvent,生成的合成移动命令从preMovePoint当前的pos各形状。我仍然有兴趣知道是否有更好的方法。