c++ qtreewidget支持撤销恢复代码

时间: 2023-09-09 10:08:00 浏览: 39
以下是一个简单的示例代码,演示如何在QTreeWidget中使用QUndoStack和QUndoCommand来实现撤销和恢复功能: ```cpp #include <QApplication> #include <QTreeWidget> #include <QUndoStack> #include <QUndoCommand> // 自定义的添加节点的命令类 class AddNodeCommand : public QUndoCommand { public: AddNodeCommand(QTreeWidget *treeWidget, QTreeWidgetItem *parent, const QStringList &strings, int index) : m_treeWidget(treeWidget), m_parent(parent), m_index(index) { setText(QStringLiteral("Add Node")); // 在此记录添加节点前的状态 m_beforeState = treeWidget->currentItem() ? treeWidget->currentItem()->text(0) : QString(); } void undo() override { // 撤销操作:删除刚才添加的节点 QTreeWidgetItem *child = m_parent->child(m_index); m_parent->removeChild(child); m_treeWidget->setCurrentItem(m_parent); // 在此记录撤销后的状态 m_afterState = m_treeWidget->currentItem() ? m_treeWidget->currentItem()->text(0) : QString(); } void redo() override { // 恢复操作:重新添加之前删除的节点 QTreeWidgetItem *child = new QTreeWidgetItem(m_parent, m_index); child->setText(0, m_strings[0]); child->setText(1, m_strings[1]); child->setText(2, m_strings[2]); m_treeWidget->setCurrentItem(child); // 在此记录恢复后的状态 m_afterState = m_treeWidget->currentItem() ? m_treeWidget->currentItem()->text(0) : QString(); } bool mergeWith(const QUndoCommand *other) override { // 如果两个命令的类型相同,且父节点和索引相同,则认为它们可以合并为一个操作 const AddNodeCommand *command = static_cast<const AddNodeCommand *>(other); if (command && command->m_parent == m_parent && command->m_index == m_index) { m_strings = command->m_strings; return true; } return false; } private: QTreeWidget *m_treeWidget; QTreeWidgetItem *m_parent; QStringList m_strings; int m_index; QString m_beforeState; QString m_afterState; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QTreeWidget treeWidget; treeWidget.setColumnCount(3); treeWidget.setHeaderLabels(QStringList() << "Name" << "Type" << "Value"); QUndoStack undoStack; QObject::connect(&treeWidget, &QTreeWidget::itemChanged, [&undoStack](QTreeWidgetItem *item, int column) { // 监听节点的修改操作,每次修改都会创建一个命令 Q_UNUSED(column) QStringList strings; strings << item->text(0) << item->text(1) << item->text(2); QUndoCommand *command = new QUndoCommand(); command->setText(QStringLiteral("Edit Node")); command->setParent(&undoStack); command->addCommand(new AddNodeCommand(treeWidget, item->parent(), strings, item->parent()->indexOfChild(item))); undoStack.push(command); }); QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget); root->setText(0, "Root"); QTreeWidgetItem *child1 = new QTreeWidgetItem(root); child1->setText(0, "Child 1"); child1->setText(1, "Type 1"); child1->setText(2, "Value 1"); QTreeWidgetItem *child2 = new QTreeWidgetItem(root); child2->setText(0, "Child 2"); child2->setText(1, "Type 2"); child2->setText(2, "Value 2"); treeWidget.expandAll(); treeWidget.show(); return app.exec(); } ``` 在上述代码中,我们使用了QUndoStack和QUndoCommand来管理QTreeWidget中节点的添加、删除和修改操作。当用户执行操作时,我们会创建一个相应的QUndoCommand,并将其推入QUndoStack中。当用户想要撤销操作时,我们可以调用QUndoStack中的undo()函数,该函数会执行当前堆栈顶部的命令的撤销操作。当用户想要恢复操作时,我们可以调用redo()函数,该函数会执行当前堆栈顶部的命令的恢复操作。

相关推荐

最新推荐

recommend-type

使用C++调用Python代码的方法详解

主要介绍了使用C++调用Python代码并给大家介绍了.py和.pyc的区别,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

学籍管理系统源代码 c++.docx

为了学校更加高效,快捷,方便的管理学生信息,并实现以下功能: (1)对学生信息进行录入:先输入学生的学籍,然后输入学生姓名,年龄,性别,籍贯,系别,专业,班级等,最后输入学生状态(入学)。...
recommend-type

win10环境下vscode Linux C++开发代码自动提示配置(基于WSL)

主要介绍了win10环境下vscode Linux C++开发代码自动提示配置(基于WSL),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

约瑟夫环问题用C++代码实现

8. 【题目】约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又...
recommend-type

vscode使用官方C/C++插件无法进行代码格式化问题

官方的C/C++插件是支持使用.clang-format配置文件进行自定义风格代码格式化的,无需另外安装clang-format插件。 但是使用clang-format -style=llvm -dump-config &gt; .clang-format导出的默认配置文件进行格式化的时候...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。