undo / redo的命令模式:何时不合并undo命令?

时间:2016-04-01 21:04:57

标签: c++ merge qt5 undo-redo command-pattern

我正在基于Qt5的图形应用程序中实现撤消/重做功能,使用QUndoCommand具有良好的mergeWith()功能:例如,如果用户反复单击字体大小增加按钮我的应用程序,而不是在撤消列表中创建大量命令,它只是更新QUndoStack上的一个命令。因此,单个撤消将恢复为原始字体大小。

这很好,但有时候我不想自动合并命令。例如,如果我将项目拖动到新位置并将其拖放到那里,则将同一项目拖动到另一个位置:我的应用程序应创建2个移动命令,而不是将它们合并为一个命令。

所以,这里是我认为创建逻辑中断的事件列表,即使下一个命令更改同一对象的相同属性,用户也希望命令不与下一个命令合并:

  • 鼠标释放
  • 小部件失去焦点
  • 计时器(在???秒之后)
  • 文字打字,之后???字符(或者这可以用计时器处理?)
  • 文本输入,按下某些键后,如退格键?

正如我的列表中的问号所示,我不确定在什么情况下抑制合并命令。所以我的问题是,这方面有什么最佳做法吗?我在哪里可以找到它们?

1 个答案:

答案 0 :(得分:0)

FWIW,我没有找到任何最佳实践,但对于我的软件,我抑制了焦点更改的合并(在我的应用程序中也发生在图形部分的鼠标释放上)。另外,对于输入,如果输入位置以预期的方式改变以删除或键入1个字符,并且用户在删除字符和键入字符之间切换,则禁止合并。

我没有打扰计时器,也没有打字的最大字符。