QUndoView

  Qt的Undo框架是命令模式(Command pattern) 的实现,用于在应用程序中实现撤消/重做功能.
  继承自QListView,它显示在推送到撤销堆栈QUndoStack上命令列表
常用方法:
  push(): 将命令推入堆栈或将其与最近执行的命令合并;
  undo(): 通过调用QUndoCommand.undo()撤消当前命令下方的命令。减少当前命令索引。如果堆栈为空,或者堆栈上的底部命令已被撤消,则此功能不执行任何操作;
  redo(): 通过调用QUndoCommand.redo()重做当前命令。增加当前命令索引。如果堆栈为空,或者已经重做了堆栈上的顶层命令,则此功能不执行任何操作;
  createUndoAction(): 创建一个撤销QAction对象;
  createRedoAction(): 创建一个重做QAction对象;
  clear(): 清除命令堆栈,然后将堆栈返回到干净状态。命令不会被撤消或重做;编辑对象的状态保持不变。当放弃文档内容时,通常使用此功能。

常用信号:
  canRedoChanged: 当canRedo()的值发生改变时,发射此信号,它用于启用或禁用createRedoAction()返回的QAction对象的触发操作;
  canUndoChanged: 当canUndo()的值发生改变时,发射此信号,它用于启用或禁用createUndoAction()返回的QAction对象的触发操作;

QUndoCommand:
  是存储在QUndoStack上的所有命令的基类, 对操作命令的撤销和重做功能的实现必须在其派生类里提供。
  QUndoCommand对象由它们被压入的堆栈所拥有。如果已撤消命令并推送了新命令,则QUndoStack会删除该命令。
  当命令被压入QUndoStack时,它成为堆栈上最顶层的命令。

QUndoCommand常用方法:
  actionText(): 返回一个简短的文本字符串,描述此命令的作用;例如“插入文本”;
  child(): 返回指定索引处的子命令;
  childCount(): 返回此命令中子命令的数目;
  redo(): 重做操作,该函数必须在派生类里实现;
  undo(): 撤销操作,该函数必须在派生类里实现;
  setText(): 将命名的文本信息设置为指定的文本;
  text(): 返回命令的文本信息。

QUndoGroup:
  是一组QUndoStack对象,其中一个可能是活动状态。
   QUndoGroup有一个undo()和redo()函数,它调用处于活动状态的QUndoStack.undo()和QUndoStack.redo()。
  使用addStack()将堆栈加入到组中,使用removeStack将堆栈移除组。
  当使用QUndoGroup作为QUndoStack的父对象时,QUndoStack对象将隐式地添加到组中。

QUndoGroup常用方法:
createUndoAction(): 创建一个撤销QAction对象;
createRedoAction(): 创建一个重做QAction对象;
redo(): 在活动堆栈上调用QUndoStack.redo()。如果没有一个堆栈处于活动状态,或者该组为空,则此功能不执行任何操作;
undo(): 在活动堆栈上调用QUndoStack.undo()。如果没有一个堆栈处于活动状态,或者该组为空,则此功能不执行任何操作。

QUndoGroup常用信号:
  activeStackChanged(): 当组的活动堆栈发生改变时,发射此信号;
  canRedoChanged(): 当活动堆栈发出QUndoStack.canRedoChanged()信号或者活动堆栈发生改变时,发射此信号;
  canUndoChanged(): 当活动堆栈发出QUndoStack.canUndoChanged()信号或者活动堆栈发生改变时,发射此信号;
  redoTextChanged(): 当活动堆栈发出QUndoStack.redoTextChanged()信号或者活动堆栈发生改变时,发射此信号;
  undoTextChanged(): 当活动堆栈发出QUndoStack.undoTextChanged()信号或者活动堆栈发生改变时,发射此信号。

代码

widgetundoview.h

#ifndef WIDGETUNDOVIEW_H
#define WIDGETUNDOVIEW_H#include <QWidget>
#include <QUndoCommand>
#include <QUndoStack>
#include <QAction>namespace Ui {
class WidgetUndoView;
}class OperateCommand;class WidgetUndoView : public QWidget
{Q_OBJECTpublic:explicit WidgetUndoView(QWidget *parent = nullptr);~WidgetUndoView();void initUndoView();protected:void changeEvent(QEvent* event);private slots:void on_pushButton_clicked();private:void retranslateUi();private:QAction* m_pUndoAction;QAction* m_pRedoAction;private:QUndoStack* m_pUndoStack;private:Ui::WidgetUndoView *ui;
};//继承于QUndoCommand,实现撤销和重做功能
class OperateCommand : public QUndoCommand
{
public:OperateCommand();void redo() override;void undo() override;
};#endif // WIDGETUNDOVIEW_H

widgetundoview.cpp

#include "widgetundoview.h"
#include "ui_widgetundoview.h"
#include "commondef.h"WidgetUndoView::WidgetUndoView(QWidget *parent) :QWidget(parent),ui(new Ui::WidgetUndoView)
{ui->setupUi(this);initUndoView();
}WidgetUndoView::~WidgetUndoView()
{delete ui;
}void WidgetUndoView::initUndoView()
{m_pUndoStack = new QUndoStack(this);//创建一个撤销QAction对象m_pUndoAction = m_pUndoStack->createUndoAction(this, "Undo");//指定快捷键m_pUndoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z));//创建一个重做QAction对象;m_pRedoAction = m_pUndoStack->createRedoAction(this, "Redo");//指定快捷键m_pRedoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Y));//添加QAction对象addAction(m_pUndoAction);addAction(m_pRedoAction);//设置视图显示的堆栈ui->undoView->setStack(m_pUndoStack);}void WidgetUndoView::changeEvent(QEvent *event)
{switch(event->type()){case QEvent::LanguageChange:retranslateUi();break;default:QWidget::changeEvent(event);}
}void WidgetUndoView::retranslateUi()
{ui->label->setText(tr("Use Undo View"));
}OperateCommand::OperateCommand()
{setText("OperateCommand");
}//接收到QUndoStack的canRedoChanged信号时触发
void OperateCommand::redo()
{setText("Redo");
}//接收到QUndoStack的canUndoChanged信号时触发
void OperateCommand::undo()
{setText("Undo");
}//将命令推入堆栈中
void WidgetUndoView::on_pushButton_clicked()
{QUndoCommand* operCmd = new OperateCommand();m_pUndoStack->push(operCmd);
}

实现效果:

工程代码下载:

https://download.csdn.net/download/linyibin_123/86512679

Qt之撤销命令视图的使用(QUndoView)相关推荐

  1. Qt中的模型视图设计模式

    文章目录 1 初探Qt中的模型视图设计模式 2 模型视图中的索引 3 模型中的数据组织方式初探 1 初探Qt中的模型视图设计模式 模型视图设计模式的核心思想: 模型(数据)与视图(显示)相分离. 模型 ...

  2. Qt Creator使用命令行选项

    Qt Creator使用命令行选项 使用命令行选项 使用自定义样式 使用命令行选项 您可以启动Qt Creator并从命令行指定一些选项.例如,您可以打开任何行和列的文件. 要指定命令行选项,请在Qt ...

  3. Qt Creator添加3D视图

    Qt Creator添加3D视图 添加3D视图 添加3D视图 要创建Qt Quick 3D UI项目,我们建议使用Qt Quick 3D应用程序模板向导模板,该模板将Qt Quick 3D QML类型 ...

  4. git如何查看缓存区文件内容_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

    一.可以将git简单的分为三个区域   1.工作区(working directory)    2.暂缓区(stage index)    3.历史记录区(history)    如图: 其中git ...

  5. linux vi编辑撤销,vi撤销命令(u和U),撤销上一次的操作

    撤销命令是非常有用的,它可以撤销前一次的误操作或不合适的操作对文件造成的影响.撤销命令分为以下两种. u 命令:该命令撤销上一次所做的操作.多次使用 u 命令会一步一步依次撤销之前做过的操作(在一次切 ...

  6. Qt高级教程图形视图部分

    Qt高级教程图形视图部分

  7. Qt实现ping命令检测主机是否在线

    最近遇到这个需求,但是发现一个问题,主机可以使用TCP连接但是使用HTTP连接超时(ping超时),于是需要用QT实现ping命令. 网上看了一下,发现竟然没有实现!于是只能自己实现了! 首先需要说明 ...

  8. linux的vim撤销命令,[Linux] Vim 撤销 回退 操作

    在vi中按u可以撤销一次操作 u   撤销上一步的操作 Ctrl+r 恢复上一步被撤销的操作 注意: 如果你输入"u"两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式 ...

  9. Qt操作主/从视图和XML

    mainwindow.h [cpp] view plain copy /** * 书本:[Qt5开发及实例] * 功能:Qt操作主/从视图和XML * 文件:mainwindow.h * 时间:201 ...

最新文章

  1. 北京哪儿有卖tods豆豆鞋的?在线等答案、、、、(类似动物园、西单等地)_百度知道...
  2. AI 时代保护儿童刻不容缓!智源研究院发布我国首个儿童人工智能发展原则《面向儿童的人工智能北京共识》...
  3. Jmeter学习(三)
  4. Eclipse下配置主题颜色
  5. 基于ssh的ktv预定管理系统
  6. mysql数据库入门教程(12):变量讲解大全
  7. java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...
  8. Java中OutOfMemoryError(内存溢出)的情况及解决办法
  9. Windows与Linux比较:相似与不同
  10. Axure各种版本注册码 | 最新Axure RP 8.1.0.3377的授权码
  11. Nginx 限流配置-令牌桶算法
  12. 最新PHP小旋风站群系统源码Ver9.02+带安装教程
  13. 温度反转效应(文末附2018数字IC后端最新校招笔试题目)
  14. Read timed out executing GET (读取执行GET超时)
  15. 别出心裁的Linux系统调用学习法
  16. kubernetes 实用 api list
  17. java onmouseover_第8天:javascriptDOM小 案例、onmouseover 、onmouseout
  18. Nexus因异常重启导致OrientDB数据库变为只读的问题修复
  19. 因果推断笔记——因果图建模之Uber开源的CausalML(十二)
  20. c语言程序设计形成性作业3,C语言程序设计形成性作业3-4..doc

热门文章

  1. js中如何求平面两点之间的距离
  2. 一张足够长厚5mm的纸折叠多少次高度可以超过珠穆朗玛峰
  3. python----模块
  4. C# 实现预览dwg文件完整源代码(无需autocad环境)
  5. 树莓派安装Linux操作系统
  6. 国企上班和私企上班哪个更好?
  7. 最近似乎都没怎么自学,觉得很愧疚,慎独真的很重要
  8. OSChina 周一乱弹 —— 好气哦,还是要保持微笑
  9. 双向链表的删除和插入
  10. 微信小程序开发之.js文件