文档章节

Qt Undo Framework Demo

eryar
 eryar
发布于 2015/01/13 19:31
字数 1646
阅读 50
收藏 0

Qt Undo Framework Demo

eryar@163.com

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 is done by creating instances of command objects. Command objects apply changes to the document and are stored on a command stack. Furthermore, each command knows how to undo its changes to bring the document back to its previous state. As long as the application only uses command objects to change the state of the document, it is possible to undo a sequence of commands by traversing the stack downwards and calling undo on each command in turn. It is also possible to redo a sequence of commands by traversing the stack upwards and calling redo on each command. 

Key Words. Qt, Undo/Redo, Command Pattern, Model/View

1. Introduction

在交互应用程序中撤销和重做(Undo/Redo)能力是很重要的。像常见的软件Office,AutoCAD等,有了撤销功能,用户体验更舒服。一般都会使用Command模式来实现这一功能。

命 令模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求,这个对象可被存储并像其他对象一样被传递。这一模式的关键是一个抽象的 Command类,它定义了一个可执行操作的接口。其最简单的形式是一个抽象的Execute操作。具体的Command子类将接收者作为其一个实例变 量,并实现Execute操作,指定接收者采取动作,而接收者执行该请求所需要的具体信息。在GoF的《Design Patterns》中,给出了Command模式的一般结构,如图1.1所示:

wps_clip_image-581

Figure 1.1 Command pattern structure

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录成日志,以及支持可撤销的操作。

支持任意层次的撤销和重做命令的最后一步是定义一个命令历史记录(Command History),或称为已执行的命令列表。从概念上理解,命令的历史记录看起来有如下形状:

wps_clip_image-5187

Figure 1.2 Command History

每 个圆代表一个Command对象,标有present的对象即为当前命令对象。当我们调用Unexecute()后,标有present的对象将会向左 移;当调用Execute(),标有present的对象将会向右移。重复这个过程,我们可以进行多层次的撤销,层次数只受命令历史记录长度的限制。

在Qt的Undo框架中主要包括以下几个类:

v QUndoCommand:这个类相当于Command模式中的那个抽象基类Command,所有这些命令都被保存到undo栈中,在其派生类中实现undo和redo函数。

v QUndoStack:这个相当于命令历史记录,其中保存了Command对象的列表。

v QUndoGroup:是一个undo stack的组合。

v QUndoView:是显示undo堆栈中内容的一个列表组件,在这个视图中点击命令的名称也可以实现与Undo/Redo按钮相同的作用。

本文通过一个简单的例子来示例Qt中Undo框架,先在简单的List模型中实现,进而在Tree上实现。掌握Qt的这个框架,就可以不用OpenCASCADE的OCAF了,并且Qt的代码用起来还是相对简单清晰的。

2.Example

Qt提供了一个Undo框架的示例,程序还涉及到图形绘制相关的内容,程序效果如下图2.1所示:

wps_clip_image-17325

Figure 2.1 Qt Undo Framework Example

结合这个示例程序,学习一下Qt的Undo框架,从而写出一个更简单的程序,代码如下所示:

class InsertCommand : public QUndoCommand
{
public:
    InsertCommand(const QModelIndex& theIndex, QStringListModel* theModel);
    ~InsertCommand();

public:
    virtual void undo();
    virtual void redo();

private:
    QModelIndex mIndex;
    QStringListModel* mModel;
};

首先,从QUndoCommand派生出一个插件字符串的类InsertCommand,并要实现undo()和redo()这两个虚函数,实现代码如下所示:

void InsertCommand::undo()
{
    mModel->removeRows(mIndex.row(), 1);
}

void InsertCommand::redo()
{
    mModel->insertRows(mIndex.row(), 1);
    mModel->setData(mIndex, QString("Insert string " + QString::number(mIndex.row())));
}

这样在响应工具栏按钮的函数中,只需要生成这个命令,并将命令加入到命令栈中即可,代码如下:

void undoTest::insertString()
{
    QModelIndex aIndex = mListView->currentIndex();

    mUndoStack->push(new InsertCommand(aIndex, mListModel));
}

程序运行效果如下图2.2所示:

wps_clip_image-9457

Figure 2.3 Test Qt Undo Framework

通过工具栏上的undo/redo及命令列表中选择,都可以实现命令的回退及重做。完整的程序代码可通过文后链接下载。

3.Conclusion

在 学习C++基本语法后,可以看看GoF的《设计模式》。刚刚接触可能感觉有些抽象,这时可以使用Qt来编写一些程序来练练手。用Qt来编程感觉比MFC要 舒服很多,有些类封装得很直接,易于使用。尽管MFC中也有个Document/View的设计模式,但是Qt中的MVC用起来更直接。通过使用现有的框 架,来理解那些抽象的设计模式,从而加深面向对象的观念,让自己的程序更简单,有趣。

OpenCASCADE的OCAF框架也提供了一个 数据框架,基于这个树形的框架,可以存储层次表示的数据,且也提供了Undo/Redo的支持。基于OCAF框架,可以快速开发出一定功能的专业软件了。 但是要使用OCAF框架,涉及的OpenCASCADE库很多。如果打算开发一个轻量级的三维程序,而又正好选择了Qt来开发GUI,这时就可以考虑使用 Qt的MVC框架及在这个框架上的Undo/Redo功能,这样开发效率可以相对高一些,且程序发布时依赖的动态库也要少很多。

流行的工 厂设计软件中的数据框架多用树形结构,树中每个结点上的属性可以让用户自由扩展,像OCAF中通过TDataStd_Integer添加一些整数属性一 样,及用TDataStd_Name添加名称属性。但是OCAF中添加属性有些局限性,因为每种属性是用GUID来区别的,所以每个结点上同一种属性只能 有一个。

所以用Qt的MVC框架来根据需要实现一个自定义的树形Model,再基于V3d_Viewer实现一个显示三维的View,即可以实现一个简单,但看上去相对专业的CAD建模程序了。

4. References

1. GoF. Design Patterns-Elements of Reusable Object-Oriented Software.机械工业出版社. 2010

2. Qt5.4. Overview of Qt’s Undo Framework. 2014

3. Qt5.4. Undo Framework Example. 2014

4. OpenCASCADE6.8.0. OCAF. 2014

5. OpenCASCADE6.8.0. OCAF White Paper. 2014

6. OpenCASCADE6.8.0. Distribution of Data Through OCAF Tree. 2014

 

PDF Version and Source code: Qt Undo Framework Demo

© 著作权归作者所有

eryar
粉丝 22
博文 127
码字总数 227012
作品 0
武汉
私信 提问
qcdong/XXEditor

#XXEditor XXEditor是一个cocos2d-x 2.x的UI编辑器,内部使用CocosStudio控件。使用Qt5.4.1 + quick-cocos2d-x 开发,可运行在Windows、Mac、Linux。这个项目是QCEditor的2.x lua版本。希望能...

qcdong
2016/07/05
0
0
qt之二维绘图:添加一个撤销堆栈菜单实现

总结:在mainwindows中添加一个QUndoStack和QUndoView。在构造函数中给edit[undoAction&redoAction]和view[Undo stack]添加不同的动作。 注意:edit中的undo和redo操作只需要添加响应的API就...

OceanStar
2018/09/04
64
0
QT 5.4.1 for Android Ubuntu QtWebView Demo

QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一、说明: 二、参考文章: 三、QtWebView Demo在哪里? 四、Qt Creator 3.4.0能打开QtWebView Demo? 五、Qt Creator如何生成A...

zengjf
2015/05/15
0
0
LibrePCB 0.1.2 发布,强大直观的 EDA 工具

LibrePCB 0.1.2 已经发布,LibrePCB 是一个免费的 EDA 软件,用于开发印刷电路板。LibrePCB 0.1.2 支持最新的构建环境,用 GCC 9.x 和 Qt 5.13 编译,不会报告任何警告,能够使用 Qt 的模型/...

afterer
07/16
1K
0
Texmaker 3.3.4 发布,LaTex 文档制作

Texmaker 3.3.4 发布,该版本修复了 undo 操作一个关键的 bug,完成了数学环境的语法高亮。 Texmaker 集成了很多的工具便于在制作LaTex文档。是一个并不依赖kde的QT程序。...

oschina
2012/05/25
897
6

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
20分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
25分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
29分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
30分钟前
3
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
36分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部