基于QT + C++的QTreewidget树结点复制及粘贴

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_TreeNodeCopy.h"

#include <QWidget>
#include <QVBoxLayout>
#include <QTreeWidget>


class TreeNodeCopy : public QMainWindow
{
    Q_OBJECT

public:
    TreeNodeCopy(QWidget *parent = nullptr);
    ~TreeNodeCopy();
public:
	QWidget *centralWidget{nullptr};
	QVBoxLayout *verticalLayout{ nullptr };
	QTreeWidget *treeWidget{ nullptr };

	QMenu *contextMenu{ nullptr };
	QAction *actionOption1{ nullptr };
	QAction *actionOption2{ nullptr };

	QString currentData; // 当前复制的结点数据

private:
	void InitUI();
	void InsertTreeItem();
	void InitSignalAndSlots();
	void setupContextMenu();

public slots:
		void PopTreeWidgetMenu(const QPoint &point);

	void copyNodes();
	void pasteNodes();

private:
    Ui::TreeNodeCopyClass ui;
};

```cpp
#include "TreeNodeCopy.h"

#include <QTreeWidgetItem>
#include <qDebug>
#include <QStyleFactory>
#include <QHeaderView>

TreeNodeCopy::TreeNodeCopy(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	InitUI();

	setupContextMenu();

	InitSignalAndSlots();

	InsertTreeItem();
}

TreeNodeCopy::~TreeNodeCopy()
{}

void TreeNodeCopy::InitUI()
{
	centralWidget = new QWidget(this);
	centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
	verticalLayout = new QVBoxLayout(centralWidget);
	verticalLayout->setSpacing(6);
	verticalLayout->setContentsMargins(11, 11, 11, 11);
	verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
	treeWidget = new QTreeWidget(centralWidget);
	treeWidget->setObjectName(QString::fromUtf8("treeWidget"));

	verticalLayout->addWidget(treeWidget);
	setCentralWidget(centralWidget);

	// 设置颜色
	QString strStyleSheet = QString("QSplitter::handle { background-color: rgb(179, 179, 179); }") //分割线的颜色
		+ QString("QSplitter {border: 2px solid green}");
	this->setStyleSheet(strStyleSheet);
	this->setStyle(QStyleFactory::create("windows"));   // 将树加上虚线


	//this->scrollToTop();    //让滚动条滚动到最顶部
	// 水平滑动条
	treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
	treeWidget->header()->setStretchLastSection(false);

	// 启用多选  
	//treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
	//treeWidget->setSelectionBehavior(QAbstractItemView::SelectItems);

	treeWidget->setHeaderHidden(true); // 隐藏树表头
	treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);   //支持右键菜单
}

void TreeNodeCopy::InsertTreeItem()
{
	QTreeWidgetItem *pRootItem = new QTreeWidgetItem(treeWidget);
	pRootItem->setText(0, QStringLiteral("根结点"));
	pRootItem->setData(0, Qt::UserRole, QStringLiteral("root")); // 树结点设值

	QTreeWidgetItem* pGroupItem = new QTreeWidgetItem(pRootItem);
	pGroupItem->setText(0, QStringLiteral("组结点"));
	pGroupItem->setData(0, Qt::UserRole, QStringLiteral("Group"));

	// 添加子结点
	QTreeWidgetItem* pOperItem1 = new QTreeWidgetItem(pGroupItem);
	pOperItem1->setText(0, QStringLiteral("结点1"));
	pOperItem1->setData(0, Qt::UserRole, QStringLiteral("child"));

	QTreeWidgetItem* pOperItem2 = new QTreeWidgetItem(pGroupItem);
	pOperItem2->setText(0, QStringLiteral("结点2"));
	pOperItem2->setData(0, Qt::UserRole, QStringLiteral("child"));

	QTreeWidgetItem* pOperItem3 = new QTreeWidgetItem(pGroupItem);
	pOperItem3->setText(0, QStringLiteral("结点3"));
	pOperItem3->setData(0, Qt::UserRole, QStringLiteral("child"));

	treeWidget->expandAll();

}

void TreeNodeCopy::InitSignalAndSlots()
{
	connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, &TreeNodeCopy::PopTreeWidgetMenu);

}

void TreeNodeCopy::setupContextMenu()
{
	contextMenu = new QMenu(treeWidget);
	actionOption1 = contextMenu->addAction(QStringLiteral("Copy"));
	actionOption2 = contextMenu->addAction(QStringLiteral("Paste"));

	connect(actionOption1, &QAction::triggered, this, &TreeNodeCopy::copyNodes);
	connect(actionOption2, &QAction::triggered, this, &TreeNodeCopy::pasteNodes);
}

void TreeNodeCopy::PopTreeWidgetMenu(const QPoint &point)
{
	QModelIndex index = treeWidget->indexAt(point);
	// 存在性判断,并踏出菜单栏
	if (index.isValid()) {
		contextMenu->exec(treeWidget->viewport()->mapToGlobal(point));
	}
}

void TreeNodeCopy::copyNodes()
{
	QTreeWidgetItem *currentItem = treeWidget->currentItem();
	currentData = currentItem->data(0, Qt::UserRole).value<QString>();
}

void TreeNodeCopy::pasteNodes()
{
	if (!currentData.isEmpty()) {
		QTreeWidgetItem *currentItem = treeWidget->currentItem();
		if (currentItem) {
			// 获取当前选中的节点  
			QTreeWidgetItem *selectedItem = treeWidget->currentItem();
			if (!selectedItem) {
				// 如果没有选中任何节点,可以返回或执行其他操作  
				return;
			}

			// 创建新的树节点  
			QTreeWidgetItem *sonItem = new QTreeWidgetItem();
			QString temp = QStringLiteral("%1_复制文件").arg(currentData);
			sonItem->setText(0, temp);
			//设置数据
			sonItem->setData(0, Qt::UserRole, currentData);

			// 获取选中节点在顶层项目中的索引  
			int index = treeWidget->indexOfTopLevelItem(selectedItem);
			if (index != -1) {
				// 在选中节点之后插入新节点作为同级节点  
				treeWidget->insertTopLevelItem(index + 1, sonItem);
			}
			else {
				// 如果选中节点不是顶层节点,你需要找到其父节点并相应地插入  
				QTreeWidgetItem *parentItem = selectedItem->parent();
				if (parentItem) {
					int childIndex = parentItem->indexOfChild(selectedItem);
					int count = parentItem->childCount();
					qDebug() << count;
					//在指定位置插入树结点
					parentItem->insertChild(childIndex + 1, sonItem);
					count = parentItem->childCount();
					qDebug() << count;

				}
				else {
					// 如果选中节点没有父节点,则不能作为子节点插入  
					// 这里可能需要其他逻辑处理  
				}
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值