当前位置: 首页 > article >正文

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();
}

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

           


http://www.kler.cn/a/390079.html

相关文章:

  • TortoiseSVN提示服务器凭证检核错误:站点名称不符
  • 【121. 买卖股票的最佳时机】——贪心算法/动态规划
  • pySpark乱码
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • STM32单片机WIFI语音识别智能衣柜除湿消毒照明
  • python实战(八)——情感识别(多分类)
  • 测试实项中的偶必现难测bug--一键登录失败
  • Vite环境下uniapp Vue 3项目添加和使用环境变量的完整指南
  • SystemVerilog学习笔记(四):用户自定义类型
  • Rust常量
  • 24GHz毫米波雷达探测器,办公室灯光照明控制,共筑节能减排风尚
  • 【开源社区】使用 ES 实现多种地理位置检索
  • 【系统配置】命令行配置麒麟安全中心应用程序来源检查
  • 深圳华为展厅:30寸OLED透明屏中控桌引领科技新风尚
  • UEditor(百度开源的在线编辑器,修改版)
  • PaddleYOLO目标检测训练(集成SwanLab可视化全过程)
  • 基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板
  • 【前端学习笔记】JavaScript学习一【变量与数据类型】
  • 在vscode中开发运行uni-app项目
  • ‘conda‘ 不是内部或外部命令,也不是可运行的程序或批处理文件,Miniconda
  • Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式
  • [Meachines] [Medium] Compiled Git-RCE+Visual Studio 2019权限提升
  • [ Linux 命令基础 2 ] Linux 命令详解-系统管理命令
  • Rust学习(二):rust基础语法Ⅰ
  • conda环境迁移,修改conda路径(附带脚本)
  • Java版——设计模式笔记