• QtC++与QUndoView详解


    介绍

    QUndoView 的作用:

    1. 显示操作历史: QUndoView 用于显示 QUndoStack 中记录的撤销和重做操作的历史记录。用户可以通过该视图查看操作的执行顺序。

    2. 支持交互: 提供了用户界面元素,允许用户执行撤销和重做操作,以及查看操作的详细信息。

    3. 定制外观: 开发者可以通过设置不同的风格和样式,以适应应用程序的整体外观。

    4. 集成撤销框架: QUndoView 通常与 QUndoStack 一起使用,配合 QUndoCommand 表示每个操作,构建一个完整的撤销/重做框架。

    QUndoView 常用方法和信号:

    以下是一些常用的方法和信号,可用于控制和响应 QUndoView 的行为:

    • setStack(QUndoStack *stack): 设置与 QUndoView 关联的 QUndoStack

    • clear(): 清空视图,移除所有操作历史记录。

    • setEmptyLabel(const QString &text): 设置在没有操作历史时显示的文本标签。

    • setCleanIcon(const QIcon &icon): 设置表示 “干净状态” 的图标。

    • setUndoText(const QString &text): 设置显示在撤销按钮上的文本。

    • setRedoText(const QString &text): 设置显示在重做按钮上的文本。

    • setGroup(QActionGroup *group): 将视图中的动作添加到指定的动作组,以确保在一组中只有一个动作是选中的。

    • undoTextChanged(const QString &undoText): 当撤销文本发生变化时触发的信号。

    • redoTextChanged(const QString &redoText): 当重做文本发生变化时触发的信号。

    • cleanChanged(bool clean): 当操作历史记录变为 “干净” 或 “不干净” 时触发的信号。

    • indexAt(const QPoint &point) const: 返回视图中给定点的索引,通常用于在用户点击的位置执行自定义操作。

    示例应用场景:

    1. 文本编辑器: 在文本编辑器中使用 QUndoView 可以显示用户执行的编辑操作历史,允许用户撤销和重做操作。

    2. 图形编辑工具: 图形编辑工具中的撤销和重做功能通常使用 QUndoView 显示,以方便用户了解编辑历史。

    3. CAD 应用程序: 在计算机辅助设计 (CAD) 软件中,QUndoView 可以用于显示对设计的撤销和重做操作。

    4. 配置界面: 在应用程序的配置界面中,QUndoView 可以帮助用户查看和管理配置更改的历史。

    5. 数据分析工具: 在数据分析工具中,QUndoView 可以显示用户对数据进行的操作历史,支持撤销和重做。

    注意事项:

    • QUndoView 通常需要与 QUndoStack 一起使用,确保操作历史记录能够被正确地显示和管理。

    • 定制 QUndoCommand 类以表示每个撤销和重做操作,并确保在操作执行和撤销时适当地更新应用程序状态。

    • 对于复杂的操作历史记录,可能需要定制 QUndoView 的外观和交互效果,以满足应用程序的需求。

    结论:

    QUndoView 是一个方便的 Qt 类,用于显示撤销和重做操作的历史记录。通过结合 QUndoStack 和自定义的 QUndoCommand,可以构建强大的撤销/重做框架,为用户提供友好的交互体验。在实际应用中,结合 QUndoView 的使用场景和需求,可以更灵活地定制和扩展这一功能。

    示例

    ```cpp
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        // 创建一个撤销栈
        QUndoStack undoStack;
    
        // 创建一个简单的文本编辑器
        QTextEdit textEdit;
        textEdit.setPlainText("Hello, Qt Undo Framework!");
    
        // 将文本编辑器的内容绑定到撤销栈
        textEdit.document()->setUndoStack(&undoStack);
    
        // 创建一个撤销视图
        QUndoView undoView(&undoStack);
    
        // 创建主窗口
        QWidget mainWindow;
        QVBoxLayout layout(&mainWindow);
        layout.addWidget(&textEdit);
        layout.addWidget(&undoView);
    
        // 添加一些演示用的撤销命令
        QAction *uppercaseAction = new QAction(QIcon(":/images/uppercase.png"), "Uppercase", &mainWindow);
        QObject::connect(uppercaseAction, &QAction::triggered, [&textEdit, &undoStack]() {
            textEdit.textCursor().removeSelectedText();  // 删除选中的文本
            QString selectedText = textEdit.textCursor().selectedText().toUpper();
            textEdit.textCursor().insertText(selectedText);
            undoStack.push(new QUndoCommand("Uppercase", [&textEdit, selectedText]() {
                // 实现反向操作
                textEdit.textCursor().removeSelectedText();
                textEdit.textCursor().insertText(selectedText.toLower());
            }));
        });
    
        QAction *insertDateAction = new QAction(QIcon(":/images/insertdate.png"), "Insert Date", &mainWindow);
        QObject::connect(insertDateAction, &QAction::triggered, [&textEdit, &undoStack]() {
            QString currentDate = QDate::currentDate().toString();
            textEdit.textCursor().insertText(currentDate);
            undoStack.push(new QUndoCommand("Insert Date", [&textEdit, currentDate]() {
                // 实现反向操作
                textEdit.textCursor().removeSelectedText();
            }));
        });
    
        // 将演示用的动作添加到主窗口
        mainWindow.addAction(uppercaseAction);
        mainWindow.addAction(insertDateAction);
    
        mainWindow.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    1. 自定义撤销命令: 如何创建自定义的 QUndoCommand 类,以实现特定的撤销和重做操作。

    2. 使用 QAction 进行操作触发: 如何使用 QActionQUndoView 集成,通过动作触发执行撤销和重做操作。

    3. 撤销栈状态管理: 如何通过 QUndoStack 提供的方法获取和管理撤销栈的状态,例如栈是否为空、是否处于“干净”状态等。

    4. 多个撤销栈的管理: 如何处理一个应用程序中存在多个独立的撤销栈,例如对于多文档界面 (MDI) 的应用。

    5. 定制视图外观: 如何使用样式表或其他方式定制 QUndoView 的外观,以满足应用程序的整体风格。

    6. 与其他 Qt 组件集成: 如何将 QUndoView 与其他 Qt 组件进行集成,例如将其嵌套在 QMainWindow 中或与 QMenuQToolBar 等一起使用。

    7. 多语言支持: 如何在支持多语言的应用程序中使用 QUndoView,以确保界面文字能够正确本地化。

    8. 使用 QGraphicsScene 如何在图形场景中使用 QUndoView,例如在图形编辑器中显示图形对象的撤销历史。

    9. 定制交互体验: 如何通过自定义事件处理或其他方式为 QUndoView 添加特殊的交互效果,例如定制点击事件或双击事件。

    10. 撤销和重做的优化: 如何在处理大量数据或复杂操作时优化撤销和重做的性能。

  • 相关阅读:
    rust开发wasm 01
    一、MFC介绍
    HTML5、CSS3、ES6新特性总结
    vue表格不显示列号123456
    Set接口的实现类---HashSet
    每个程序员必须掌握的常用英语词汇
    CentOS7 NTP客户端的时间同步详解
    @Lazy注解的原理
    Robot Framework 自动化测试详解
    【3】Docker镜像相关命令
  • 原文地址:https://blog.csdn.net/LuXiaoXin1999/article/details/134493479