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);

    }
相关推荐
sali-tec13 分钟前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
生骨大头菜2 小时前
使用python实现相似图片搜索功能,并接入springcloud
开发语言·python·spring cloud·微服务
绝不收费—免费看不了了联系我2 小时前
Fastapi的单进程响应问题 和 解决方法
开发语言·后端·python·fastapi
消失的旧时光-19432 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
咖啡续命又一天2 小时前
Trae CN IDE 中 Python 开发的具体流程和配置总结
开发语言·ide·python·ai编程
4311媒体网2 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
GSDjisidi3 小时前
东京IT软件会社-(株)GSD|多种技术栈募集,高度人才+20分
开发语言·面试·职场和发展
程序员zgh3 小时前
Linux系统常用命令集合
linux·运维·服务器·c语言·开发语言·c++
獭.獭.4 小时前
C++ -- STL【unordered_set与unordered_map的实现】
开发语言·c++·unordered_map·unordered_set
Bigan(安)4 小时前
【奶茶Beta专项】【LVGL9.4源码分析】09-core-obj_class对象类系统
linux·c语言·mcu·arm·unix