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

    }
相关推荐
Pandaconda27 分钟前
【新人系列】Python 入门(二十七):Python 库
开发语言·笔记·后端·python·面试··python库
Lenyiin30 分钟前
《 C++ 点滴漫谈: 二十二 》操作符炼金术:用C++ operator重塑代码美学
c++·operator·lenyiin·c++关键字
0xCC说逆向44 分钟前
Windows图形界面(GUI)-QT-C/C++ - Qt键盘与鼠标事件处理详解
c语言·开发语言·c++·windows·qt·win32·1024程序员节
Pandaconda1 小时前
【Golang 面试题】每日 3 题(三十六)
开发语言·经验分享·笔记·后端·面试·golang·go
CURRY30_HJH1 小时前
JAVA使用自定义注解,在项目中实现EXCEL文件的导出
java·开发语言·excel
不爱学英文的码字机器1 小时前
[JavaScript] 深入理解流程控制结构
开发语言·前端·javascript
wakkkaaa2 小时前
C++ 面向对象(继承)
开发语言·c++
道剑剑非道2 小时前
QT开发技术 【基于TinyXml2的对类进行序列化和反序列化】一
数据库·qt·算法
四念处茫茫2 小时前
【C语言系列】深入理解指针(1)
c语言·开发语言·visual studio
很楠不爱2 小时前
Qt——界面优化
开发语言·qt