qt QUndoCommand 与 QUndoStack详解

1、概述

QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做(undo/redo)功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类,而 QUndoStack 则负责管理这些命令的堆栈,提供撤销和重做操作的接口。

  • QUndoCommand:这是一个抽象基类,用于封装一个可以执行和撤销的操作。每个命令对象都必须实现 redo() 和 undo() 方法,分别用于执行和撤销该命令。此外,命令还可以选择性地实现 mergeWith() 方法,以便在可能的情况下将连续的操作合并为一个命令。

  • QUndoStack:这个类管理着一系列 QUndoCommand 对象,这些对象以堆栈的形式存储。QUndoStack 提供了 push() 方法来添加新命令,undo() 和 redo() 方法来分别撤销和重做命令。此外,它还提供了查询当前是否可以撤销或重做操作的接口,以及监听堆栈状态变化的信号。

2、重要方法

QUndoCommand

  • redo():执行命令。
  • undo():撤销命令。
  • mergeWith(const QUndoCommand *other):尝试将当前命令与另一个命令合并。
  • id():返回命令的唯一标识符(通常用于调试)。
  • setText(const QString &text) 和 text():设置和获取命令的描述文本。

QUndoStack

  • push(QUndoCommand *command):将命令推送到堆栈上。
  • undo():撤销堆栈顶部的命令。
  • redo():重做最近撤销的命令。
  • clear():清空堆栈。
  • canUndo() 和 canRedo():查询当前是否可以撤销或重做操作。
  • undoText() 和 redoText():获取当前可以撤销或重做的命令的描述文本。
  • command(int index):获取堆栈中指定索引的命令。
  • count():获取堆栈中命令的数量。
3、重要信号

QUndoStack 发出以下信号来通知堆栈状态的变化:

  • cleanChanged(bool clean):当堆栈变为干净(即没有可撤销的操作)或不干净时发出。
  • canUndoChanged(bool canUndo):当可以撤销的操作数量发生变化时发出。
  • canRedoChanged(bool canRedo):当可以重做的操作数量发生变化时发出。
  • undoTextChanged(const QString &undoText):当可以撤销的操作的描述文本发生变化时发出。
  • redoTextChanged(const QString &redoText):当可以重做的操作的描述文本发生变化时发出。

#include <QUndoCommand>
#include <QString>
#include <QDebug>

class TextEditCommand : public QUndoCommand
{
public:
    TextEditCommand(const QString &oldText, const QString &newText, QString &textBuffer, int id = -1)
        : m_oldText(oldText), m_newText(newText), m_textBuffer(textBuffer)
    {
        setText("Edit Text");
    }

    // 撤销操作
    void undo() override
    {
        m_textBuffer = m_oldText;
        qDebug() << "Undo: " << m_textBuffer;
    }

    // 重做操作
    void redo() override
    {
        m_textBuffer = m_newText;
        qDebug() << "Redo: " << m_textBuffer;
    }

private:
    QString m_oldText;
    QString m_newText;
    QString &m_textBuffer; // 引用要修改的文本
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString textBuffer = "Hello, world!";

    // 创建一个撤销栈
    QUndoStack undoStack;

    // 执行第一次编辑操作
    TextEditCommand *command1 = new TextEditCommand("Hello, world!", "Hello, Qt!", textBuffer);
    undoStack.push(command1);

    // 执行第二次编辑操作
    TextEditCommand *command2 = new TextEditCommand("Hello, Qt!", "Hello, QUndo!", textBuffer);
    undoStack.push(command2);

    // 查看当前文本
    qDebug() << "Current Text: " << textBuffer;

    // 执行撤销操作
    undoStack.undo();

    // 查看撤销后的文本
    qDebug() << "After Undo: " << textBuffer;

    // 执行重做操作
    undoStack.redo();

    // 查看重做后的文本
    qDebug() << "After Redo: " << textBuffer;

    return a.exec();
}

觉得有帮助的话,打赏一下呗。。

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Struts源码阅读——三个常用的辅助类DispatchAction

Struts源码阅读——三个常用的辅助类 紧接前文&#xff0c;我们来阅读org.apache.struts.actions包中三个常用类的源码。 DispatchAction、LookupDispatchAction 和 MappingDispatchAction 是 Struts 1 框架中的三个常用的辅助类&#xff0c;用来简化 Action 类中的请求分发。…

C++中的栈(Stack)和堆(Heap)

在C中&#xff0c;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;是两种用于存储数据的内存区域。理解它们的原理和区别&#xff0c;对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析&#xff0c;包括它们的分配方式、优缺点、应用场…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS&#xff08;读取时间戳计数器&#xff09;指令是 x86/x86_64 架构中的…

MySQL查询某个数据库中特定表的空间占用大小

如果您也想要查询某个数据库中特定表的空间占用大小&#xff0c;包括数据和索引的大小&#xff0c;那么您可以使用以下SQL查询。这个查询将显示特定表在数据库中的数据大小、索引大小以及总大小。 SELECT table_name AS Table,ROUND(((data_length index_length) / 1024 / 10…

SystemVerilog学习笔记(十一):接口

在Verilog中&#xff0c;模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构&#xff0c;它封装了模块之间的通信。一个 inter…

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

Pikachu[暴力破解:token防爆破]

暴力破解:token防爆破 校验方式&#xff1a; 请求中添加token防止爆破&#xff0c;登录时需携带服务器上一次加载时发送的token进行校验 解决&#xff1a; burp--intruder模块设置中使用Grep-Extract功能提取页面中的token&#xff0c;并将载荷类型更改为递归查询[Recursiv…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解 文章目录 exists用法SQL中in, not in, exists, not exists的区别使用实例本文小结 exists用法 exists: 如果括号内子查询语句返回结果不为空&#xff0c;说明where条件成立&#xff0c;就会执行主SQL语句。如果括号…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…

基于微信小程序的高校实习管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误

今天看了下书翻了下Spring Boot的用法&#xff0c;下载idea后&#xff0c; 反复出现org.springframework.boot:spring-boot-maven-plugin:找不到类错误&#xff0c;后来看了下调试窗口&#xff0c;发现是连不上maven的网站443错误&#xff0c;解决思路很简单&#xff0c;把ide连…

k-近邻算法(K-Nearest Neighbors, KNN)详解:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

UE5 umg学习(四) 将UI控件显示到关卡中

视频资料 7、将UI控件渲染到关卡_哔哩哔哩_bilibili 在前三节里&#xff0c;创建了用户的控件蓝图Widget_BP 目标是运行的时候&#xff0c;开始运行这个蓝图&#xff0c;因此需要在开始事件触发运行 首先&#xff0c;回到主页&#xff0c;点击关卡蓝图 要从事件开始运行时 …

StarRocks Summit Asia 2024 全部议程公布!

随着企业数字化转型深入&#xff0c;云原生架构正成为湖仓部署的新标准。弹性扩展、资源隔离、成本优化&#xff0c;帮助企业在云上获得了更高的灵活性和效率。与此同时&#xff0c;云原生架构也为湖仓与 AI 的深度融合奠定了基础。 在过去一年&#xff0c;湖仓技术与 AI 的结…

【CSS】opacity 影响 z-index 不生效

准备知识 一般来说&#xff0c;z-index 不生效的原因有&#xff1a; 父元素的 position 属性&#xff1a; z-index 只对 position 属性为 relative、absolute 或 fixed 的元素有效。 其他元素的 z-index&#xff1a; 如果页面中有其他元素也设置了较高的 z-index&#xff0c;…

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品&#xff0c;是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要&#xff0c;专门加工配置而成的配方食品&#xff0c;包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…