Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing Undo - Redo Functionality in Qt?

Tags:

c++

qt

My program consists of multiple QLineEdit's in my QMainWindow. The user can change the text in any QLineEdit. Currently I can perform undo-redo by the default implementation for each QLineEdit when the respective QLineEdit is selected. However I want to add functionality so that when my undo *redo* buttons are pressed then, correspondingly the edited QLineEdit performs undo/redo. i.e. say L1, L2, etc are my QLineEdit's. Then the following operations are done by the user: 1. L2->text added ... 5. L5->text added ... 9. L3->text deleted 10. L5->undo (by selecting L5 & then "ctrl + z")

Now when the user presses Undo/Redo button as follows: 1. Undo -> Should undo the undo performed in step 10 2. Undo -> Should undo the text deleted in step 9 3. Redo -> Should redo the text deleted in step 9 4. Undo -> Should undo the operation done by step 8

Currently I can vaguely think of a mechanism of mainlining the History but it will be pretty tedious. So I would like to know if Qt provides me any inbuilt functionality for doing this? Thank You.

like image 572
Cool_Coder Avatar asked Feb 21 '13 09:02

Cool_Coder


2 Answers

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.

like image 180
Andreas Fester Avatar answered Oct 18 '22 13:10

Andreas Fester


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.

like image 29
Pete Avatar answered Oct 18 '22 12:10

Pete