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();
}
相关推荐
hoiii18714 小时前
Qt 实现屏幕截图功能
开发语言·qt·命令模式
满天星830357715 小时前
【Qt】信号和槽(三) (断开连接和lambda函数)
qt
fpcc15 小时前
C++编程实践—C++实现类似Qt的信号槽机制
c++·qt
郝学胜_神的一滴15 小时前
Qt 高级开发 030:QListWidget 右键菜单全解,从策略配置到精准删除的优雅实现
c++·qt
海天鹰15 小时前
图片去黑边算法
qt·算法
走好每一步18 小时前
5、VTK刚体变换
qt·vtk·三维图像
宏笋19 小时前
QT 隐式共享/写时复制详解
qt
San813_LDD20 小时前
[QT]Qt对象树笔记:父子关系与内存管理
开发语言·qt
luoyayun36120 小时前
Qt/QML 音频波形图模块实现:从 PCM 数据到可缩放波形
qt·音视频·波形图绘制
旖-旎20 小时前
QT初始(1)
开发语言·c++·qt