说到撤回功能就能想到栈操作,Qt提供了用于撤回功能的类QUndoStack,栈中存放的是QUndoCommand对象。
实现的思路可以简单理解为,在我们的程序中建立一个QUndoStack对象,然后把我们要Undo/Redo的操作实例为QUndoCommand对象,压入栈,然后就是对栈进行操作了。
关于QUndoStack类和QUndoCommand类的使用,在官方文档中搜索“Overview of Qt's Undo Framework”,Qt还提供了一个例子undoframework。
//----------------------------------------------------------------------------------------分隔线
如果没有使用过QUndoStack类和QUndoCommand类,建议先简单阅读一下官方文档,知道其用法。
下面给出一个我自己使用QUndoStack类和QUndoCommand类实现QTableWidget撤回功能的例子。撤回功能需要知道cell的旧值,我的做法是给QTableWidget设置了委托(TableDelegate类),通过委托记录cell的旧值。
直接上代码,环境Qt_5_12_4_MinGW_32_bit。
ModifCommand类
class ModifCommand : public QUndoCommand
{
public:
ModifCommand(QTableWidget *pTable, int row, int col, QString oldValue, QString value, QUndoCommand *parent = nullptr);
void undo() override;
void redo() override;
private:
QTableWidget *m_table;
int m_row;
int m_col;
QString m_value;

本文介绍了如何利用Qt的QUndoStack和QUndoCommand类为QTableWidget和QTableView实现撤消/重做功能。通过创建自定义的ModifCommand类和TableDelegate类,记录单元格的旧值并在操作后压栈,实现了对表格内容修改的跟踪。同时,给出了详细的代码示例,包括对委托和模型数据的处理,以及与QUndoStack的交互。
最低0.47元/天 解锁文章
4634

被折叠的 条评论
为什么被折叠?



