Windows图形界面(GUI)-QT-C/C++ - Qt Tree Widget详解与应用

目录

QTreeWidget基础概念

使用场景

常见样式

QTreeWidget属性设置

显示属性

交互属性

QTreeWidget常见操作

初始化和设置

创建和配置树控件

设置表头

数据操作

添加顶层项

插入顶层项

获取和移除顶层项

选择和当前项

获取和设置当前项

获取选中的项

展开和折叠

展开和折叠项

检查项是否展开

查找和遍历

查找包含指定文本的项

获取指定位置的项

获取项的模型索引

清空和删除

清空所有项

移除指定项的控件

QTreeWidget信号和槽

常用信号

项被点击

项被双击

选择项发生变化

项展开和折叠


QTreeWidget基础概念

QTreeWidget 是 Qt 中一个功能强大的树状控件,适用于显示和管理分层数据。它内置了一个标准的模型(QTreeWidgetItem),使得数据的添加、删除和管理变得更加简单。

使用场景

  • 显示和管理分层数据,如文件系统、组织结构等。
  • 需要多列显示数据时。
  • 需要对数据进行分组和分类展示时。

常见样式

  1. 带表头的树:显示树状结构的同时显示表头。
  2. 隐藏表头的树:隐藏表头,只显示树状结构。
  3. 交替行颜色的树:行背景颜色交替显示,提升可读性。

QTreeWidget属性设置

显示属性

  • headerHidden :是否隐藏表头。设置为 true 将隐藏表头,默认为 false
  • columnCount:列的数量。可以设置树控件的列数。
  • alternatingRowColors :交替行颜色。设置为 true 时,行背景颜色将交替显示。
  • rootIsDecorated :是否显示根节点的装饰。设置为 true 时,根节点前会有展开/折叠的标志,默认为 true
  • sortingEnabled :是否启用排序。设置为 true 时,可以对列进行排序。

交互属性

  • editTriggers:编辑触发器,决定哪些操作可以触发编辑。例如,双击、单击等。
  • selectionBehavior:选择行为,决定是选择行、列还是单个单元格。
  • selectionMode:选择模式,决定可以选择的项目数,例如单选、多选等。
  • columnWidth:列宽度。可以为每一列设置固定的宽度。
  • indentation:缩进。设置子项相对于父项的缩进级别。
  • uniformRowHeights :是否统一行高。设置为 true 时,所有行将具有相同的高度。
  • itemsExpandable :项目是否可展开。设置为 true 时,节点可以被展开和折叠。

QTreeWidget常见操作

初始化和设置

创建和配置树控件
cpp 复制代码
    QTreeWidget *treeWidget = new QTreeWidget(this);
    treeWidget->move(200, 200);
    treeWidget->resize(300, 300);
    treeWidget->setColumnCount(2);
    treeWidget->setHeaderLabels(QStringList() << "Name" << "Details");
    treeWidget->setAlternatingRowColors(true);
    treeWidget->setRootIsDecorated(true);
    treeWidget->setSortingEnabled(true);
设置表头
cpp 复制代码
treeWidget->setHeaderHidden(false);  
treeWidget->setHeaderLabels(QStringList() << "Column 1" << "Column 2");

数据操作

添加顶层项
cpp 复制代码
QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(treeWidget);  
topLevelItem->setText(0, "Top Level Item");  
treeWidget->addTopLevelItem(topLevelItem);
插入顶层项
cpp 复制代码
QTreeWidgetItem *insertedItem = new QTreeWidgetItem;  
insertedItem->setText(0, "Inserted Item");  
treeWidget->insertTopLevelItem(1, insertedItem);
获取和移除顶层项
cpp 复制代码
QTreeWidgetItem *item = treeWidget->takeTopLevelItem(0);  
delete item;

选择和当前项

获取和设置当前项
cpp 复制代码
QTreeWidgetItem *currentItem = treeWidget->currentItem();  
treeWidget->setCurrentItem(currentItem);
获取选中的项
cpp 复制代码
QList<QTreeWidgetItem*> selectedItems = treeWidget->selectedItems();

展开和折叠

展开和折叠项
cpp 复制代码
treeWidget->expandItem(topLevelItem);  
treeWidget->collapseItem(topLevelItem);

查找和遍历

查找包含指定文本的项
cpp 复制代码
QList<QTreeWidgetItem*> foundItems = treeWidget->findItems("Search Text", Qt::MatchContains, 0);
获取指定位置的项
cpp 复制代码
QTreeWidgetItem *item = treeWidget->itemAt(10, 10);
获取项的模型索引
cpp 复制代码
QModelIndex index = treeWidget->indexFromItem(topLevelItem, 0);  
QTreeWidgetItem *itemFromIndex = treeWidget->itemFromIndex(index);

清空和删除

清空所有项
cpp 复制代码
treeWidget->clear();
移除指定项的控件
cpp 复制代码
treeWidget->removeItemWidget(topLevelItem, 0);

QTreeWidget信号和槽

常用信号

项被点击
cpp 复制代码
connect(treeWidget, &QTreeWidget::itemClicked, this, [](QTreeWidgetItem *item, int column) {  
    qDebug() << "Item clicked:" << item->text(column);  
});
项被双击
cpp 复制代码
connect(treeWidget, &QTreeWidget::itemDoubleClicked, this, [](QTreeWidgetItem *item, int column) {  
    qDebug() << "Item double clicked:" << item->text(column);  
});
选择项发生变化
cpp 复制代码
connect(treeWidget, &QTreeWidget::itemSelectionChanged, this, []() {  
    qDebug() << "Selection changed";  
});
项展开和折叠
cpp 复制代码
connect(treeWidget, &QTreeWidget::itemExpanded, this, [](QTreeWidgetItem *item) {  
    qDebug() << "Item expanded:" << item->text(0);  
});  

connect(treeWidget, &QTreeWidget::itemCollapsed, this, [](QTreeWidgetItem *item) {  
    qDebug() << "Item collapsed:" << item->text(0);  
});

示例代码

cpp 复制代码
    void InitTreeWidget()
    {
        //设置表头数
        ui->treeWidget->setColumnCount(2);

        //设置表头项
        QStringList treeHead;
        treeHead << "班级" << "课程";
        ui->treeWidget->setHeaderLabels(treeHead);

        //根节点
        QTreeWidgetItem* root1 = new QTreeWidgetItem;
        QTreeWidgetItem* root2 = new QTreeWidgetItem;

        //子节点
        QTreeWidgetItem* child11 = new QTreeWidgetItem;
        QTreeWidgetItem* child12 = new QTreeWidgetItem;
        QTreeWidgetItem* child21 = new QTreeWidgetItem;

        child11->setText(0, "张三");
        child11->setText(1, "FPS");

        child12->setText(0, "李四");
        child12->setText(1, "RPG");

        child21->setText(0, "王五");
        child21->setText(1, "MacOs");

        root1->setText(0, "游戏防护");
        root2->setText(0, "系统安全");

        //关联子节点
        root1->addChild(child11);
        root1->addChild(child12);
        root2->addChild(child21);

        //设置根节点
        ui->treeWidget->addTopLevelItem(root1);
        ui->treeWidget->addTopLevelItem(root2);

        //数量索引
        qDebug() << "RootCount" << ui->treeWidget->topLevelItemCount();
        qDebug() << "Root1ChildCount" << root1->childCount();
        qDebug() << "Root1ChildCount" << root2->childCount();
        qDebug() << "IndexOfChild" << root1->indexOfChild(child11);
        qDebug() << "IndexOfChild" << root1->indexOfChild(child12);

        //删除操作
        //ui->treeWidget->takeTopLevelItem(0);
        //root1->takeChild(0);

        ui->treeWidget->expandItem(root1);
        qDebug() << "isItemExpand" << ui->treeWidget->isItemExpanded(root1);

    }
相关推荐
wuminyu1 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
lqj_本人2 小时前
WinPcap 鸿蒙 PC 适配全记录:从 NPF 原始抓包到 VPN_TUN 与 libpcap 双通路
qt·华为·harmonyos
Blockbuater_drug2 小时前
FreeSASA: 开源 SASA 计算库,pip 一条命令替代 NACCESS
c语言·开源·sasa·freesasa·溶剂可及表面积·naccess·python api
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
言乐64 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
金金计较.4 小时前
Go语言-3
java·开发语言·golang
Logic1014 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
张小凡vip5 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
Quz5 小时前
QML StackView:三种入栈方式(Item、Component 与 URL)
qt
Wang's Blog5 小时前
Java框架快速入门: Spring Security+OAuth2之云服务集成与多因子认证设计
java·开发语言·spring