前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tiled源码分析(三): Undo/Redo实现

Tiled源码分析(三): Undo/Redo实现

作者头像
逍遥剑客
发布2018-05-21 15:50:12
1.1K0
发布2018-05-21 15:50:12
举报

就像之前说过的, 没有Undo/Redo的编辑器都是耍流氓

优点

不过, Qt为我们提供了Undo/Redo的完整框架, 连工具栏按钮和History控件都齐活了

Command模式的核心当然是Command, 就是说所有操作都是QUndoCommand, push进一个QUndoStack就redo, pop一个就是undo

Tiled中比较特别是多文档编辑器, 也就意味着有多个QUndoStack, 所以比我之前写的编辑器多用了个QUndoGroup, 用于切换当前使用的stack

另外, QUndoView就是现成的操作记录控件, 真是省心...

无意中发现了beginMacro/endMacro的调用, 原来一个command序列可以一次性undo/redo, 所谓的:多次修改, 一次回退"

仔细看了下文档, 有一点跟我之前想的不太一样, 判断文件需不需要保存不是看QUndoStack是不是空的, 而是有一个clean state

缺点

由于push需要访问QUndoStack, 而QUndoStack又在MapDocument中, 所以到处都充斥着mMapDocument这样的引用, 所以setMapDocument这样的SLOT到处都是

这个设计我觉得有点冗余, 是可以改进的地方, 还不如直接访问DocumentManager来得简单, 统计由DocumentManager发出documentChanged类似的signal或许更简洁

Command模式比较烦人的就是要实现很多Command, Tiled中也不能免俗, 大约有40多个

QUndoComand中对于对象的生命周期管理也是不太好的地方, 我的做法是使用引用计数和智能指针管理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年01月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优点
  • 缺点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档