QUndoView 本质是一个 Qt 界面控件(继承自 QListView),专门适配 QUndoStack

QUndoView 本质是一个 Qt 界面控件(继承自 QListView),专门适配 QUndoStack


cpp 复制代码
#include <QApplication>
#include <QUndoStack>
#include <QUndoCommand>
#include <QUndoView>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QDebug>

// 自定义可撤销命令:数字加1
class AddCommand : public QUndoCommand {
public:
    AddCommand(int& num, QUndoCommand* parent = nullptr) 
        : QUndoCommand(parent), m_num(num) {
        // 设置操作描述文本(会显示在QUndoView中)
        setText(QString("数字加1 (当前值: %1 → %2)").arg(m_num).arg(m_num + 1));
    }

    void redo() override {
        m_num += 1;
    }

    void undo() override {
        m_num -= 1;
    }

private:
    int& m_num;
};

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

    // 1. 初始化核心变量和撤销栈
    int num = 0;
    QUndoStack undoStack;

    // 2. 创建主窗口和布局
    QWidget window;
    window.setWindowTitle("QUndoView 示例");
    QVBoxLayout* layout = new QVBoxLayout(&window);

    // 3. 创建显示当前数值的标签
    QLabel* numLabel = new QLabel(QString("当前数值: %1").arg(num));
    layout->addWidget(numLabel);

    // 4. 创建"添加操作"按钮
    QPushButton* addBtn = new QPushButton("点击执行「数字加1」");
    layout->addWidget(addBtn);
    QObject::connect(addBtn, &QPushButton::clicked, [&]() {
        // 每次点击压入新的AddCommand
        undoStack.push(new AddCommand(num));
        // 更新标签显示
        numLabel->setText(QString("当前数值: %1").arg(num));
        qDebug() << "当前撤销栈大小:" << undoStack.count();
    });

    // 5. 创建QUndoView并绑定撤销栈
    QUndoView* undoView = new QUndoView(&undoStack);
    undoView->setWindowTitle("操作历史");
    // 设置空栈时的提示文本
    undoView->setEmptyLabel("暂无操作记录");
    // 调整视图大小
    undoView->resize(400, 300);
    undoView->show();

    // 6. 同步撤销/重做后的数值显示
    QObject::connect(&undoStack, &QUndoStack::undoTextChanged, [&]() {
        numLabel->setText(QString("当前数值: %1").arg(num));
    });
    QObject::connect(&undoStack, &QUndoStack::redoTextChanged, [&]() {
        numLabel->setText(QString("当前数值: %1").arg(num));
    });

    // 显示主窗口
    window.resize(300, 150);
    window.show();

    return a.exec();
}
相关推荐
丰锋ff8 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
程与留11 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci11 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
Littlehero_12113 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
Quz17 小时前
QML MouseArea 鼠标拖拽与滚轮缩放
qt
Quz17 小时前
QML MouseArea 事件传递、自定义按钮
qt
小庞在加油1 天前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
hy.z_7771 天前
【QT】1.QT初识(背景介绍、搭建开发环境、Qt Creator、程序、项目文件解析、编程注意事项)
qt
不会代码的小猴1 天前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨1 天前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5