我正在写一个Qt应用程序,它基于QGraphicsScene
画布,上面有可移动的形状,我试图集成撤消-重做功能。对于像创建和删除形状这样的大多数功能,在QGraphicsScene
本身上实现是相当琐碎的,但我希望元素是可移动的,并且移动是可撤消的。现在,我在场景中使用橡皮筋拖动模式,并在项目上使用ItemIsSelectable
和ItemIsMovable
标志。问题是似乎没有合适的地方来创建表示形状移动的QUndoCommand
。如果我在QGraphicsScene::itemChange
方法中这样做,那么选择并移动两个或多个形状会导致不同对象的单独撤消命令交错,因此无法合并,因此撤消会导致意外的行为。在我可以看到的QGraphicsScene
中,当它的项被移动时,没有事件被调用,所以我有点卡住了。
我看到的最糟糕的情况是,我禁用了自定义QGraphicsItem
对象上的ItemIsMovable
标志,并完全在QGraphicsScene
鼠标事件中处理移动,但重新正确地实现该功能似乎相当复杂(我在内部检查了Qt是如何做到这一点的,并且有相当多的代码用于处理复杂的情况,例如对象及其一些子对象都被选中的情况)。这似乎是undo堆栈最明显的用例(以至于undo框架的示例程序与我的QGraphicsScene
程序非常相似,只是不支持多对象移动),所以如果不重新实现核心功能的重要部分,就没有内置的方法来完成它,这似乎很奇怪。有没有人有这样做的程序的见解或例子?
发布于 2013-01-31 20:14:47
我想我解决这个问题有点笨拙。我向自定义形状添加了一个preMovePoint
属性,在QGraphicsScene
的mousePressedEvent
中,我将每个选定形状的preMovePoint
设置为其各自的当前位置,在mouseReleaseEvent
中,创建了一个从preMovePoint
到每个形状的当前pos
的复合移动命令。我仍然有兴趣知道是否有更好的方法。
https://stackoverflow.com/questions/14631098
复制相似问题