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

    }
相关推荐
晓晓hh18 小时前
JavaSE学习——迭代器
java·开发语言·学习
iFlyCai18 小时前
C语言中的指针
c语言·数据结构·算法
Laurence18 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen1118 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code19 小时前
String.intern() 到底干了什么
java·开发语言·面试
421!19 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
蒸汽求职19 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee4419 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
摇滚侠19 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
Tanecious.19 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯