#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 {
// 如果选中节点没有父节点,则不能作为子节点插入
// 这里可能需要其他逻辑处理
}
}
}
}
}
基于QT + C++的QTreewidget树结点复制及粘贴
最新推荐文章于 2024-04-24 10:28:27 发布