Qt如何实现QTableView的撤消与恢复功能 转载

http://hi.baidu.com/topone_top/item/3d8221f1d9fb6d0aa62988b7
1、实现TableView上的撤消与恢复功能,首先需一个类来继承QUndoCommand类,并且在继承类中实现redo()函数与undo()函数。
也就是具体的撤消与恢复功能都是在这两个函数中实现的。
例如:
class DeleteCommand:public QUndoCommand
{
public:
 DeleteCommand(SqlModel *,QVector<QModelIndex>, QVector<QVariant>, 
             QVector<QVariant>,QUndoCommand *parent = 0);
 void undo();
 void redo();
 void Clear();
private:
 QVector<QModelIndex> m_modelIndexs;
 QVector<QVariant> m_editedDatas;
 QVector<QVariant> m_orignlDatas;
 SqlModel * m_model;
};
DeleteCommand::DeleteCommand(SqlModel * model, 
 QVector<QModelIndex> ins, QVector<QVariant> ed, 
 QVector<QVariant> od, QUndoCommand *parent )
 :QUndoCommand(parent)
{
 m_model = model;
 m_modelIndexs = ins;
 m_editedDatas = ed;
 m_orignlDatas = od;
}
void DeleteCommand::undo()
{
 for(int i = 0; i < m_modelIndexs.count(); i ++)
 {
  m_model->setData(m_modelIndexs.at(i), m_orignlDatas.at(i), Qt::EditRole);
 }
}
void DeleteCommand::redo()
{
 for(int i = 0; i < m_modelIndexs.count(); i ++)
 {
  m_model->setData(m_modelIndexs.at(i), m_editedDatas.at(i), Qt::EditRole);
 }
}
2、调用派生类。
主要代码如下:
QUndoStack  undoStack = new QUndoStack(); 
   QAction *  undoAction = undoStack->createUndoAction(this, tr("&Undo"));
    undoAction->setShortcut(tr("Ctrl + Z"));  
    QACtion * redoAction = undoStack->createRedoAction(this, tr("&Redo"));
   redoAction->setShortCut(tr("Ctrl + Y"));
 DeleteCommand * deleteCommand = new DeleteCommand(m_sqlmodel, indexVec, editedVec, orginVec);
    undoStack->push(deleteCommand );
通过undoStack来创建ACtion,将两者联系起来。就可以实现撤消与删除的功能了。
 3、另外说明
如果是多窗口则需要用QUndoGroup
每个窗口用一个QUndoStack
每个命令用一个QUndoCommand
自己实现QUndoCommand的子类,并且重新实现redo和undo函数即可
 
当然,也可以参照Qt自带的例子。
#Qt

转载于:https://my.oschina.net/jingzhe/blog/158917

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值