Все есть в документации Qt -
http://doc.qt.nokia.com/4.7-snapshot/qundo.htmlВкратце.
На каждое действие создается класс унаследованный от QUndoCommand, в котором нужно переопределить методы redo и undo.
Код из одного проекта:
class RotatePointer(QUndoCommand):
def __init__(self, item, oldangle, newangle):
QUndoCommand.__init__(self, tr("Rotate viewpointer"))
self.item = item
self.newangle = newangle
self.oldangle = oldangle
def redo(self, *args, **kwargs):
self.item.setRotation(self.newangle)
def undo(self, *args, **kwargs):
self.item.setRotation(self.oldangle)
Управляется все через QUndoStack()
self.undo_stack = QUndoStack()
...
self.undo_stack.push(SomeCommand(...))