QUndoCommand你会用吗



采用Qt‘s Undo Framework实现undo和redo操作。

比如在做一个记事本程序  想要实现一个删除文本的操作,这个操作可以撤销和重现,即可以实现所谓的undo()和redo()操作。

此时只需让删除操作继承至QUndoCommand类,比如叫做DeleteTextCommand,并实现redo和undo这两个虚函数。在删除操作的响应槽函数SlotDeleteText()中,创建DeleteTextCommand对象,并放入QUndoStack。

如下代码所示:

删除类.h文件

class DeleteTextCommand:public QUndoCommand

{

public:

// 构造函数

DeleteTextCommand();

// 实现redo 、undo

void
undo();

void
redo();

}

在undo和redo函数中实现具体的操作,在redo中实现删除操作,undo中实现撤销删除操作,恢复删除之前的状态,思路是在redo中保存一份被删除的东西的列表,在undo中获取,就是使用这份列表进行复原。

删除槽函数:

void CMainWin::slotDeleteText()

{

QUndoCommand *pDeleteTextCommond = new DeleteTextCmd();

m_pUndoStack->push(pDeleteTextCommond);

//push的时候会自动去调用DeleteTextCmd的redo方法。

}

需要注意的是:在QUndoStack把命令push到堆栈的时候,会自动调用一次此命令的redo方法。

在主函数中  实现撤销和复原功能如下,如下写:

void WorkflowSceneManager::slotUndo()

{

m_pUndoStack->undo();//自动调用DeleteTextCommand的undo方法

HideAllModuleNameEdit();

}

void WorkflowSceneManager::slotRedo()

{

m_pUndoStack->redo();//自动调用DeleteTextCommand的redo方法

HideAllModuleNameEdit();

}

具体原理为command设计模式,待补充。

时间: 2024-12-11 23:00:04

QUndoCommand你会用吗的相关文章

将vim作为QT开发的IDE

转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIMDIR/vim72/syntax/cpp.vim,加入 syn keyword cppStatement SLOT,SIGNAL syn keyword cppAccess slots,signals 2.增加QT的类型名: syn keyword cType ActiveQt Q3Accel Q3

QtWidgets Module's Classes

Qt Widgets C++ Classes The Qt Widgets module extends Qt GUI with C++ widget functionality. More... API Reference These are links to the API reference materials. Qt Widgets C++ Classes Basic Widget Classes Advanced Widget Classes Abstract Widget Class

Qt Undo Framework Demo

Qt Undo Framework Demo [email protected] Abstract. Qt’s Undo Framework is an implementation of the Command Pattern, for implementing undo/redo functionality in applications. The Command pattern is based on the idea that all editing in an application

qt QUndoGroup的使用

最近项目中用到撤销,恢复功能.qt的demo中有一个例子,是类似于单文档的.而我的项目中是类似于多文档的项目,即可能要打开多个页面,不同的页面都有撤销恢复功能.这样的话,就要用到QUndoGroup类.网上资料相对较少.我把自己的探索写出来,抛砖引玉,和大家讨论. 我把我的工程结构大概描述一下:MainFrame为主框架,MainFrame有菜单栏,且在MainFrame中有多个tab页(多个窗口). 这样,我下文中将tab页的两个窗口类名记为A,B. 我在MainFrame类中定义成员变量 Q