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

    }
相关推荐
HalvmånEver9 分钟前
在 C++ :x86(32 位)和 x64(64 位)的不同
开发语言·c++·学习
amy_jork2 小时前
npm删除包
开发语言·javascript·ecmascript
浪成电火花3 小时前
(deepseek!)deepspeed中C++关联部分
开发语言·c++
茉莉玫瑰花茶3 小时前
Qt 常用控件 - 9
开发语言·qt
艾伦~耶格尔4 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
杜子不疼.4 小时前
《Python列表和元组:从入门到花式操作指南》
开发语言·python
WYH2874 小时前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#
祈祷苍天赐我java之术5 小时前
Java 迭代器(Iterator)详解
java·开发语言
谱写秋天5 小时前
FreeRTOS中断服务程序(ISR)详细讲解
c语言·freertos·isr
秋氘渔5 小时前
综合案例:Python 函数知识整合 — 学生成绩管理系统
开发语言·python