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 <QApplication>
#include <QUndoStack>
#include <QUndoView>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QAction>
#include <QIcon>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. 自定义撤销命令: 如何创建自定义的 QUndoCommand 类,以实现特定的撤销和重做操作。

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot-AOP学习案例

4. AOP案例 SpringAOP的相关知识我们就已经全部学习完毕了。最后我们要通过一个案例来对AOP进行一个综合的应用。 4.1 需求 需求&#xff1a;将案例中增、删、改相关接口的操作日志记录到数据库表中 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时&#xff0…

整形数据和浮点型数据在内存中的存储差别

愿所有美好如期而遇 我们先来看代码&#xff0c;猜猜结果是什么呢&#xff1f; int main() {//以整型数据的方式存储int n 10;float* m (float*)&n;//以整型数据的方式读取printf("%d\n", n);//以浮点型数据的方式2读取printf("%f\n", *m);printf(&…

Linux下查看pytorch运行时真正调用的cuda版本

一般情况我们会安装使用多个cuda版本。而且pytorch在安装时也会自动安装一个对应的版本。 正确查看方式&#xff1a; 想要查看 Pytorch 实际使用的运行时的 cuda 目录&#xff0c;可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量。 import torch import torch.utils imp…

系统移植-uboot

uboot概述&#xff1a; 操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到 一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1.初始化软硬件环境 2.引导加载linux内核 3. 给lin…

13 Go的错误处理

概述 在上一节的内容中&#xff0c;我们介绍了Go的接口&#xff0c;包括&#xff1a;定义接口、实现接口、使用接口、空接口等。在本节中&#xff0c;我们将介绍Go的错误处理。在Go语言中&#xff0c;错误处理是一种重要的编程模式&#xff0c;它用于处理可能出现的错误或异常情…

AutoSAR CANIF层配置代码分析

CAN物理控制单元 配置&#xff1a; 生成的代码&#xff1a; CanIf_CtrlStates 解析 类型&#xff1a; typedef union CanIf_CtrlStatesUTag {CanIf_CtrlStatesType raw[3];CanIf_CtrlStatesStructSType str; }CanIf_CtrlStatesUType;typedef struct sCanIf_CtrlStatesType {C…

陪诊系统搭建部署和功能,让就医更便捷和舒适

陪诊系统是一种基于智能手机平台的专门为就医提供陪伴服务的软件。该应用程序包含多种功能&#xff0c;包括提供的医疗知识、行为规范和陪伴服务。它不仅可以帮助用户规划就医时间、预约医生、清楚病情、解答疑问等&#xff0c;还可以在就医时为用户提供实时的陪伴和指导&#…

py 开启异步

在Python中&#xff0c;可以使用异步编程技术来开启异步操作。Python提供了多种异步编程库&#xff0c;其中最常用的是asyncio库。 以下是一个简单的示例&#xff0c;演示如何使用asyncio库来开启异步操作&#xff1a; import asyncioasync def my_coroutine(task):await tas…

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models

Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型&#xff0c;擅长将文本输入转换为数字表示&#xff0c;捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发&#xff0c;从创建高质量的成对&#xff08;pairwi…

WEB 自动化神器 TestCafe(一)—安装和入门篇

今天小编给大家带来WEB 自动化神器 TestCafe(一) —安装和入门篇 一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。…

Flutter笔记:目录与文件存储以及在Flutter中的使用(上)

Flutter笔记 目录与文件存储以及在Flutter中的使用&#xff08;上&#xff09; 文件系统基础知识与路径操作 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;h…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意&#xff1a;如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前&#xff1a; 执行删除后为&#xff1a; DQL - 条…

全志XR806基于http的无线ota功能实验

XR806不仅硬件功能多&#xff0c;XR806也提供了功能极其丰富的SDK&#xff0c;几天体验下来非常容易上手。常见的功能几乎都有相应的cmd或demo实现&#xff0c;HAL也做得非常全面&#xff0c;非常适合快速开发。这一点超级好评&#xff01;本文章要实现的无线OTA也基于该SDK。 …

【已解决】移动号码在移动网上营业厅更换为8元保号套餐

有很多人的副卡基本是为了接收银行卡短信&#xff0c;平时基本不打电话和用流量&#xff0c;每个月固定消费在18-30左右&#xff0c;很浪费。今天发现在网上营业厅就可以修改8元保号套餐&#xff0c;分享给大家。 保号套餐 有以下两种&#xff1a; 解决办法&#xff1a; 1、…

1688API接口接入|阿里1688-B类电商基础链路专业化体验升级

新挑战&#xff0c;新契机&#xff01; 当下整个互联网的竞争环境的变化为我们带来新的机遇和挑战。1688作为连接中小生产商、贸易商和零售商的源头货源首选平台&#xff0c;持续不断地为B类买家提供更专业的服务和更优质的源头厂货供给&#xff0c;打造核心竞争力。 面对新的…

客户端性能优化实践

背景 双十一大促时&#xff0c;客户客服那边反馈商品信息加载卡顿&#xff0c;在不断有订单咨询时&#xff0c;甚至出现了商品信息一直处于加载状态的情况&#xff0c;显然&#xff0c;在这种高峰期接待客户时&#xff0c;是没法进行正常的接待工作的。 起初&#xff0c;页面一…

程序员请放下你的技术情节,与你的同伴一起进步关心业务

如果说掌握一门赖以生计的技术是技术人员要学会的第一课的话&#xff0c; 那么我觉得技术人员要真正学会的第二课&#xff0c;不是技术&#xff0c;而是业务、交流与协作&#xff0c;学会关心其他工作伙伴的工作情况和进展。 为什么这么说呢&#xff1f; 因为技术人员太容易陷…

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有&#xff1a; 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力&#xff1b;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…

apache 基线安全加固操作

本文档适用于Apache服务器。本规范明确了Apache服务器安全配置方面的基本要求。 账号管理、认证授权 ELK-Apache-01-01-01 编号 ELK-Apache-01-01-01 名称 以特定用户运行服务 实施目的 以特定用户运行服务,不要使用系统管理员账号启动APACHE 问题影响 越权使用造成非…