gpt4 book ai didi

c++ - Qt:正确地将撤消框架与 QGraphicsScene 集成

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:37 24 4
gpt4 key购买 nike

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

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

最佳答案

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

关于c++ - Qt:正确地将撤消框架与 QGraphicsScene 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com