Qt之QTreeWidget通过撤销栈移除item

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

0.效果

QTreeWidget及QUndoStack使用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值