当前位置: 首页 > article >正文

Qt之QTreeWidget通过撤销栈移除item

本文记录QTreeWidget控件通过撤销栈移除item。
使用撤销栈的好处是可以撤销、重做,增加了软件的可交互性,提高了容错率。

0.效果

1. 创建UI

image.png

2.实现命令

.h

class C_TreeWidgetDelCmd : public QUndoCommand
{
public:
    explicit C_TreeWidgetDelCmd(QTreeWidgetItem* pCurItem,
                                QTreeWidgetItem* pItemParent,
                                int nIndex,
                                QUndoCommand *parent = nullptr);

    virtual void redo() override;
    virtual void undo() override;

signals:

private:
    QTreeWidget*            m_pTW;
    QTreeWidgetItem*        m_pCurItem;
    QTreeWidgetItem*        m_pItemParent;
    int                     m_nIndex;
};

.cpp

#include "TreeWidgetOptCmd.h"

#include <QTreeWidget>
#include <QDebug>

C_TreeWidgetDelCmd::C_TreeWidgetDelCmd(QTreeWidgetItem* pCurItem,
                                       QTreeWidgetItem* pItemParent,
                                       int nIndex,
                                       QUndoCommand *parent)
    : QUndoCommand{parent}
    , m_pCurItem(pCurItem)
    , m_pItemParent(pItemParent)
    , m_nIndex(nIndex)
{
    m_pTW = m_pCurItem->treeWidget();
}

void C_TreeWidgetDelCmd::redo()
{

    if (m_pItemParent)
    {
        m_pItemParent->removeChild(m_pCurItem);
    }
    else
    {
        m_pTW->takeTopLevelItem(m_nIndex);
    }
    m_pTW->expandAll();
}

void C_TreeWidgetDelCmd::undo()
{
    if (m_pItemParent)
    {
        m_pItemParent->insertChild(m_nIndex, m_pCurItem);
    }
    else
    {
        m_pTW->insertTopLevelItem(m_nIndex, m_pCurItem);
    }

    m_pTW->expandAll();
}

3.调用

.h

#include <QMainWindow>

#include <QTreeWidgetItem>
#include <QUndoStack>

#include "TreeWidgetOptCmd.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_btn_del_clicked();

private:
    Ui::MainWindow *ui;

    QUndoStack*     m_pUndoStack;
    QAction*        m_pActUndo;
    QAction*        m_pActRedo;
};

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_pUndoStack = new QUndoStack(this);

    m_pActUndo = m_pUndoStack->createUndoAction(this, tr("&Undo"));
    m_pActUndo->setShortcuts(QKeySequence::Undo);

    m_pActRedo = m_pUndoStack->createRedoAction(this, tr("&Redo"));
    m_pActRedo->setShortcuts(QKeySequence::Redo);

    ui->menubar->addAction(m_pActUndo);
    ui->menubar->addAction(m_pActRedo);

    connect(ui->btn_undo, &QPushButton::clicked, m_pActUndo, &QAction::trigger);

    ui->treeWidget->expandAll();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btn_del_clicked()
{
    QTreeWidgetItem* pCurItem = ui->treeWidget->currentItem();
    QTreeWidgetItem* pItemParent = nullptr;
    int nIndex = -1;
    if (pCurItem)
    {
        pItemParent = pCurItem->parent() ? pCurItem->parent() : nullptr;
        if (pItemParent)
        {
            nIndex = pItemParent->indexOfChild(pCurItem);
        }
        else
        {
            nIndex = ui->treeWidget->indexOfTopLevelItem(pCurItem);
        }

        C_TreeWidgetDelCmd* pCmd = new C_TreeWidgetDelCmd(pCurItem, pItemParent, nIndex);

        m_pUndoStack->push(pCmd);
    }
}

4.代码链接

【链接】https://download.csdn.net/download/MrHHHHHH/89987411


http://www.kler.cn/a/396868.html

相关文章:

  • 树状数组+概率论,ABC380G - Another Shuffle Window
  • MySQL Online DDL
  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
  • npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)
  • VPI photonics的一些使用经验(测相位 快速搜索)持续更新
  • 二叉树遍历的非递归实现和复杂度分析
  • 软考之RESTful 架构的特点
  • uview Collapse折叠面板无法动态设置展开问题(微信小程序)
  • Docker在微服务架构中的应用
  • 算法之二分查找优化:leetcode34:在排序数组中查找元素的第一个和最后一个位置
  • 用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)
  • 27-压力测试
  • ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解
  • JavaWeb之AJAX
  • 操作系统——虚拟存储器(含思维导图)
  • 使用pytest+openpyxl做接口自动化遇到的问题
  • 丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
  • rust并发
  • 6. Keepalived配置Nginx自动重启,实现7x24提供服务
  • 高效灵活的Django URL配置与反向URL实现方案
  • Git 分⽀规范 Git Flow 模型
  • 【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】
  • 如何在 Ubuntu 上配置 Kotlin 应用环境 ?
  • 计算机使用常用工具(持续更新)
  • Javascript 高级事件编程 - Axios fetch
  • 智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序5 架构for认知系统 总述 (架构全图)