Implementing Undo - Redo Functionality in Qt?

后端 未结 3 1183
无人及你
无人及你 2021-02-08 18:35

My program consists of multiple QLineEdit\'s in my QMainWindow. The user can change the text in any QLineEdit. Currently I can perform

相关标签:
3条回答
  • 2021-02-08 19:14

    Qt has classes to help with undo, see QUndoStack. Each undoable step should be implemented as a subclass of QUndoCommand.

    What you're trying to achieve is not straightforward because you will need to bypass the internal undo stacks of your QLineEdits. Here's one suggestion: listen for the focusChanged signal from QApplication. If one of your line edits has focus store it's content and connect to the QLineEdit::editingFinished() signal. When this is received put a command on the stack with the old and the new text. The flaw in this approach is that you will not capture intermediate edits in a single QLineEdit. For example if you wanted to store 1) the user selecting text and hitting delete, then 2) typing some new text, as separate undoable steps you might need to start filtering key events and the logic can get quite complex. But that's the general approach.

    0 讨论(0)
  • 2021-02-08 19:17

    Qt provides an Undo/Redo framework.

    You basically implement a command, derived from QUndoCommand, for each of the actions you want to make undoable/redoable, and then push them to a QUndoStack. Later, the commands can be undone and redone by calling the corresponding slots on the QUndoStack.

    Note that, when pushing a command on the stack, it is automatically redone, means executed for the first time. Sometimes this is not what you want, since the command might actually already have been executed - you would need to consider this in the implementation of your commands.

    0 讨论(0)
  • 2021-02-08 19:28

    One way of implementing this is by using the 'Command' pattern. Qt provides an undo framework that follows this pattern: http://qt-project.org/doc/qt-4.8/tools-undoframework.html

    To facilitate this, it you may need to make some changes to you program to make it a bit more MVC (model-view-controller). You'd have a data model that represents the contents of your form. The form itself is the view and the controller - any changes to the line edits made by the user would update the data model. The data model would implement changes to it using QUndoCommands which are pushed onto a QUndoStack from the Qt undo framework. When the state of the model changes (due to undo/redo), the UI would respond to the change and be updated to reflect the model's state.

    0 讨论(0)
提交回复
热议问题