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学生管理系统-- 数据库课程设计(付源码)

相关推荐
大柏怎么被偷了25 分钟前
【C++算法】位运算
开发语言·c++·算法
程序猿方梓燚27 分钟前
C/C++实现植物大战僵尸(PVZ)(打地鼠版)
c语言·开发语言·c++·算法·游戏
闻缺陷则喜何志丹27 分钟前
【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702
c++·算法·动态规划·力扣·前后缀分解·日子·适合
冲,干,闯1 小时前
VScode相关问题与解决
c++·ide·vscode
月夕花晨3742 小时前
C++学习笔记(26)
c++·笔记·学习
Flame_Cyclone2 小时前
FakerInput 键盘鼠标输入封装
c++·windows·win32·fakerinput
嵌入式杂谈2 小时前
人工智能在C/C++中的应用:图像处理与机器学习
c语言·c++·人工智能
攻城狮手搓万物3 小时前
C++函数在库中的地址
开发语言·c++
十启树3 小时前
用Qt 对接‌百度语音识别接口
人工智能·qt·百度·语音识别
YYDS3143 小时前
C++战列舰小游戏Lv. 1.4版本(半成品)
开发语言·数据库·c++·算法·游戏·游戏程序