6

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

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

4

1 回答 1

6

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

于 2013-01-31T20:14:46.750 回答