9

我的程序由我的QLineEdit多个QMainWindow. 用户可以更改任何QLineEdit. 目前,我可以在选择各自时通过默认实现为每个执行撤消重做。但是我想添加功能,以便当按下我的undo *redo* 按钮时,相应地编辑执行undo/redo。即说 L1、L2 等是我的。然后用户完成以下操作: 1. L2->添加文本... 5. L5->添加文本... 9. L3->删除文本 10. L5->撤消(通过选择 L5 & 然后“ ctrl + z")QLineEditQLineEditQLineEditQLineEdit

现在当用户按下撤消/重做按钮如下: 1.撤消 -> 应该撤消在步骤 10 中执行的撤消 2.撤消 -> 应该撤消在步骤 9 中删除的文本 3.重做 -> 应该重做在步骤 9 中删除的文本9 4. 撤消 -> 应该撤消第 8 步所做的操作

目前我可以模糊地想到一种主线历史的机制,但它会非常乏味。所以我想知道 Qt 是否为我提供了任何内置功能来做到这一点?谢谢你。

4

3 回答 3

16

Qt 提供了一个Undo/Redo框架。

QUndoCommand您基本上为要使可撤消/可重做的每个操作实现一个派生自 的命令,然后将它们推送到QUndoStack. 稍后,可以通过调用QUndoStack.

请注意,当将命令压入堆栈时,它会自动重做,表示第一次执行。有时这不是您想要的,因为该命令实际上可能已经执行 - 您需要在执行命令时考虑这一点。

于 2013-02-21T09:46:13.430 回答
3

实现这一点的一种方法是使用“命令”模式。Qt 提供了一个遵循此模式的撤消框架:http: //qt-project.org/doc/qt-4.8/tools-undoframework.html

为了促进这一点,您可能需要对程序进行一些更改,使其更像 MVC(模型-视图-控制器)。您将拥有一个代表表单内容的数据模型。表单本身就是视图和控制器——用户对行编辑所做的任何更改都会更新数据模型。数据模型将使用从 Qt 撤消框架推送到 QUndoStack 的 QUndoCommands 对其进行更改。当模型的状态发生变化时(由于撤消/重做),UI 将响应变化并更新以反映模型的状态。

于 2013-02-21T09:49:19.737 回答
1

Qt 具有帮助撤消的类,请参阅QUndoStack. 每个可撤消的步骤都应该作为QUndoCommand.

您要实现的目标并不简单,因为您需要绕过QLineEdits 的内部撤消堆栈。这里有一个建议:收听focusChanged来自 的信号QApplication。如果您的线路编辑之一具有焦点存储它的内容并连接到QLineEdit::editingFinished()信号。收到此消息后,将带有旧文本和新文本的命令放入堆栈。这种方法的缺陷是您不会在单个QLineEdit. 例如,如果您想存储 1) 用户选择文本并点击删除,然后 2) 键入一些新文本,作为单独的可撤消步骤,您可能需要开始过滤关键事件,并且逻辑可能会变得相当复杂。但这是一般方法。

于 2013-02-21T09:52:32.537 回答