QTreeWidget开放详解

QTreeWidget开放详解

  • [一、创建 QTreeWidget](#一、创建 QTreeWidget)
  • 二、QTreeWidget添加节点
    • [2.1 创建 QTreeWidget 和 添加顶级节点](#2.1 创建 QTreeWidget 和 添加顶级节点)
    • [2.2 QTreeWidget向顶级节点添加子节点](#2.2 QTreeWidget向顶级节点添加子节点)
  • [二、 QTreeWidget处理信号和槽](#二、 QTreeWidget处理信号和槽)
    • [2.1 处理节点点击信号](#2.1 处理节点点击信号)
    • [2.1 处理节点双击信号](#2.1 处理节点双击信号)
    • [2.3 处理节点展开和折叠信号](#2.3 处理节点展开和折叠信号)
  • 三、QTreeWidget右键菜单
  • 四、QTreeWidget拖拽操作
  • [五、 QTreeWidget编辑节点](#五、 QTreeWidget编辑节点)

使用 QTreeWidget 开发时,涉及到的主要知识点包括创建树结构、添加节点、处理信号和槽、定制显示、以及处理右键菜单等。以下是一些常用的开发知识点和示例代码。

一、创建 QTreeWidget

cpp 复制代码
QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
treeWidget->setHeaderLabels(headers);

二、QTreeWidget添加节点

在 QTreeWidget 中添加节点可以通过 QTreeWidgetItem 来实现。你可以向 QTreeWidget 添加顶级节点,或者向某个节点添加子节点。下面是一个详细的示例,演示了如何在 QTreeWidget 中添加节点。

2.1 创建 QTreeWidget 和 添加顶级节点

首先,我们需要创建一个 QTreeWidget 对象,并添加顶级节点:

cpp 复制代码
QTreeWidget *treeWidget = new QTreeWidget(this);
treeWidget->setColumnCount(2);
QStringList headers;
headers << "Name" << "Value";
treeWidget->setHeaderLabels(headers);

// 添加顶级节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
rootItem->setText(0, "Root");
rootItem->setText(1, "Root Value");

2.2 QTreeWidget向顶级节点添加子节点

你可以向 QTreeWidgetItem 添加子节点:

cpp 复制代码
// 添加子节点
QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
childItem1->setText(0, "Child 1");
childItem1->setText(1, "Value 1");

QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
childItem2->setText(0, "Child 2");
childItem2->setText(1, "Value 2");

二、 QTreeWidget处理信号和槽

QTreeWidget 中处理信号和槽是与其他 Qt 小部件类似的。你可以连接各种信号到槽函数以响应用户的交互,例如节点点击、双击、展开和折叠等。下面是一些常见的信号和槽的使用示例:

2.1 处理节点点击信号

你可以连接 QTreeWidget::itemClicked 信号到一个槽函数,当用户点击某个节点时触发该槽函数。

cpp 复制代码
#include <QtWidgets>

class MyTreeWidget : public QTreeWidget {
    Q_OBJECT

public:
    MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
        setColumnCount(2);
        QStringList headers;
        headers << "Name" << "Value";
        setHeaderLabels(headers);

        // 添加顶级节点
        QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
        rootItem->setText(0, "Root");
        rootItem->setText(1, "Root Value");

        // 添加子节点
        QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
        childItem1->setText(0, "Child 1");
        childItem1->setText(1, "Value 1");

        QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
        childItem2->setText(0, "Child 2");
        childItem2->setText(1, "Value 2");

        // 连接信号和槽
        connect(this, &QTreeWidget::itemClicked, this, &MyTreeWidget::onItemClicked);

        // 展开所有节点
        expandAll();
    }

private slots:
    void onItemClicked(QTreeWidgetItem *item, int column) {
        qDebug() << "Item clicked: " << item->text(column);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyTreeWidget treeWidget;
    treeWidget.show();

    return app.exec();
}

2.1 处理节点双击信号

你可以连接 QTreeWidget::itemDoubleClicked 信号到一个槽函数,当用户双击某个节点时触发该槽函数。

cpp 复制代码
#include <QtWidgets>

class MyTreeWidget : public QTreeWidget {
    Q_OBJECT

public:
    MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
        setColumnCount(2);
        QStringList headers;
        headers << "Name" << "Value";
        setHeaderLabels(headers);

        // 添加顶级节点
        QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
        rootItem->setText(0, "Root");
        rootItem->setText(1, "Root Value");

        // 添加子节点
        QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
        childItem1->setText(0, "Child 1");
        childItem1->setText(1, "Value 1");

        QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
        childItem2->setText(0, "Child 2");
        childItem2->setText(1, "Value 2");

        // 连接信号和槽
        connect(this, &QTreeWidget::itemDoubleClicked, this, &MyTreeWidget::onItemDoubleClicked);

        // 展开所有节点
        expandAll();
    }

private slots:
    void onItemDoubleClicked(QTreeWidgetItem *item, int column) {
        qDebug() << "Item double-clicked: " << item->text(column);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyTreeWidget treeWidget;
    treeWidget.show();

    return app.exec();
}

2.3 处理节点展开和折叠信号

你可以连接 QTreeWidget::itemExpandedQTreeWidget::itemCollapsed 信号到槽函数,当节点被展开或折叠时触发这些槽函数。

cpp 复制代码
#include <QtWidgets>

class MyTreeWidget : public QTreeWidget {
    Q_OBJECT

public:
    MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
        setColumnCount(2);
        QStringList headers;
        headers << "Name" << "Value";
        setHeaderLabels(headers);

        // 添加顶级节点
        QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
        rootItem->setText(0, "Root");
        rootItem->setText(1, "Root Value");

        // 添加子节点
        QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
        childItem1->setText(0, "Child 1");
        childItem1->setText(1, "Value 1");

        QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
        childItem2->setText(0, "Child 2");
        childItem2->setText(1, "Value 2");

        // 连接信号和槽
        connect(this, &QTreeWidget::itemExpanded, this, &MyTreeWidget::onItemExpanded);
        connect(this, &QTreeWidget::itemCollapsed, this, &MyTreeWidget::onItemCollapsed);

        // 展开所有节点
        expandAll();
    }

private slots:
    void onItemExpanded(QTreeWidgetItem *item) {
        qDebug() << "Item expanded: " << item->text(0);
    }

    void onItemCollapsed(QTreeWidgetItem *item) {
        qDebug() << "Item collapsed: " << item->text(0);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyTreeWidget treeWidget;
    treeWidget.show();

    return app.exec();
}

三、QTreeWidget右键菜单

同样地,可以在 QTreeWidget 上实现右键菜单操作。以下是一个示例:

cpp 复制代码
class MyTreeWidget : public QTreeWidget {
public:
    MyTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {
        setContextMenuPolicy(Qt::CustomContextMenu);
        connect(this, &QTreeWidget::customContextMenuRequested, this, &MyTreeWidget::showContextMenu);
    }

private:
    void showContextMenu(const QPoint &pos) {
        QTreeWidgetItem *item = itemAt(pos);
        if (!item) return;

        QMenu contextMenu(tr("Context menu"), this);

        QAction *action1 = new QAction("Action 1", this);
        connect(action1, &QAction::triggered, this, [this, item]() { action1Clicked(item); });
        contextMenu.addAction(action1);

        QAction *action2 = new QAction("Action 2", this);
        connect(action2, &QAction::triggered, this, [this, item]() { action2Clicked(item); });
        contextMenu.addAction(action2);

        contextMenu.exec(mapToGlobal(pos));
    }

    void action1Clicked(QTreeWidgetItem *item) {
        qDebug() << "Action 1 clicked on item: " << item->text(0);
    }

    void action2Clicked(QTreeWidgetItem *item) {
        qDebug() << "Action 2 clicked on item: " << item->text(0);
    }
};

四、QTreeWidget拖拽操作

启用拖拽操作:

cpp 复制代码
treeWidget->setDragEnabled(true);
treeWidget->setAcceptDrops(true);
treeWidget->setDropIndicatorShown(true);
treeWidget->setDragDropMode(QAbstractItemView::InternalMove);

五、 QTreeWidget编辑节点

设置节点为可编辑:

cpp 复制代码
QTreeWidgetItem *editableItem = new QTreeWidgetItem(treeWidget);
editableItem->setFlags(editableItem->flags() | Qt::ItemIsEditable);
treeWidget->editItem(editableItem, 0);

其他QT文章
1. QT开发环境安装以配置。
2. QT线段画板实战
3. 半小时玩转QT桌面系统托盘(含托盘消息)
4. QT入门开发一个时钟
5. 半小时教你做大转盘游戏(QT篇)
6. 手把手教你制作【带吸附效果的线段绘制】(QT)
7. 手把手教你开发-滚动效果号码抽奖(QT)
8. 100行代码实现贪吃蛇小游戏
9.C++实现《扫雷》游戏(入门经典)
10. svg转图片工具开发
11. Qt网路与通信(获取本机网络信息)
12. Qt网路与通信(UDP客户与服务)
13. Qt网络与通信(TCP聊天室)
14. Qt多线程以及线程池
15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
16. 取色器(QT)
17. MQTT客户端入门开发
18.QT文件上传带进度条实例(含源码)
19. Qt音乐播放器开发实例(可毕设含源码)
20. Qt学生管理系统-- 数据库课程设计(付源码)

相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
mahuifa5 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos7 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室7 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0017 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我588 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc8 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存