当前位置: 首页 > news >正文

【Qt开发】多元素类控件(三)-> QTreeWidget

目录

1 -> 概述

1.1 -> 核心概念:树与项

2 -> 关于 QTreeWidget

2.1 -> QTreeWidget 核心方法

2.2 -> QTreeWidget 核心信号

3 -> 关于 QTreeWidgetItem

3.1 -> QTreeWidgetItem 核心属性

3.2 -> QTreeQWidget 核心方法

4 -> 核心功能与特性

5 -> 典型应用场景

6 -> 代码示例

7 -> 总结


1 -> 概述

在Qt丰富的控件库中,QTreeWidget 是一个强大且灵活的多元素展示组件。它以其清晰的层级结构和直观的视觉表现,成为构建复杂用户界面的中坚力量。无论是用于文件浏览器、配置面板,还是数据分类展示,QTreeWidget 都能优雅地胜任。

1.1 -> 核心概念:树与项

理解QTreeWidget的关键在于把握其“树形结构”的核心思想。它就像我们电脑中的文件资源管理器,由根节点、分支节点和叶子节点构成。

  • 树(Tree): 整个控件本身就是一个容器,承载着这棵“树”的所有内容。

  • 项(Item): 树中的每一个节点都是一个QTreeWidgetItem对象。项不仅可以显示文本,还可以承载图标、复选框、状态信息等多种元素。

  • 层级关系: 项与项之间通过父子关系建立层级。一个项(父项)可以包含零个或多个子项,从而形成展开或折叠的分支。没有父项的项则被视为顶层项(根项)。

这种层级模型使得QTreeWidget天生适合展示任何具有从属或分类关系的数据。

2 -> 关于 QTreeWidget

2.1 -> QTreeWidget 核心方法

方法说明
clear清空所有子节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)

删除指定的顶层节点

返回 QTreeWidgetItem* 表示被删除的元素

currentItem()获取到当前选中的节点,返回 QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)展开/关闭节点
setHeaderLabel(const QString& text)设置 TreeWidget 的 header 名称

2.2 -> QTreeWidget 核心信号

信号说明
currentItemChanged(QTreeWidgetItem* current, QTreeWIdgetItem* old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item, int col)双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)鼠标进入时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发

3 -> 关于 QTreeWidgetItem

3.1 -> QTreeWidgetItem 核心属性

属性说明
text持有的文本
textAlignment文本对齐方式
icon持有的图表
font文本字体
hidden是否隐藏
disabled是否禁用
expand是否展开
sizeHint尺寸大小
selected是否选中

3.2 -> QTreeQWidget 核心方法

方法说明
addChild(QTreeWidgetItem* child)新增子节点
childCount()子节点的个数
child(int index)

获取指定下标的子节点

返回 QTreeWidgetItem*

takeChild(int index)删除对应下标的子节点
removeChild(QTreeWidgetItem* child)删除对应的子节点
parent()获取该元素的父节点

4 -> 核心功能与特性

QTreeWidget的强大之处在于它提供了一套完整的功能集,让开发者能够轻松实现复杂的交互需求。

  1. 多列支持
    与简单的列表不同,QTreeWidget支持多列(或称多栏)显示。每一列都可以有自己的标题,形成一个微型的表格树。这使得单个项可以同时展示多种相关信息。例如,在一个文件管理器中,第一列显示文件名,第二列显示文件大小,第三列显示修改日期,而树形结构则通过第一列的缩进来体现。

  2. 丰富的项内容
    每个QTreeWidgetItem都是一个信息的容器:

    • 文本与图标: 可以为每一列设置不同的文本和图标,使界面更加生动。

    • 复选框: 项可以自带复选框,方便用户进行多项选择或状态设置,无需额外添加控件。

    • 状态图标: 可以自定义项在不同状态(如展开、折叠、被选中)下显示的图标。

  3. 交互与编辑

    • 选择模式: 控件提供了灵活的选择模式,可以设置为单选、多选、扩展选择等,以适应不同的应用场景。

    • 排序: 支持按任意列进行升序或降序排序,用户只需点击列标题即可。开发者也可以自定义排序规则。

    • 项编辑: 可以设置项为可编辑模式,允许用户双击(或通过特定操作)直接修改项的文本内容。

    • 拖拽操作: QTreeWidget内置了对拖拽(Drag & Drop)的支持。开发者可以启用项的内部拖拽、跨控件拖拽,并精确控制拖拽的行为和效果,这对于实现诸如重新组织项目列表或文件移动等功能至关重要。

  4. 信号与槽
    Qt的信号与槽机制在QTreeWidget中得到了充分应用。当用户与树控件交互时,它会发出各种信号,例如:项被单击、双击、展开、折叠、选择改变、内容被编辑等。开发者可以连接这些信号到自定义的槽函数,从而实时响应用户操作,更新程序状态或执行其他逻辑。

5 -> 典型应用场景

QTreeWidget的适用场景非常广泛:

  • 文件系统浏览器: 最经典的例子,完美展示目录和文件的层级关系。

  • 配置对话框: 将设置选项按功能分类,组织成树形结构,用户可逐级深入查找和修改。

  • 数据分类展示: 如产品分类、组织结构图、图书目录等,任何需要按类别逐级细分的场景。

  • 项目大纲或导航面板: 在IDE或复杂软件中,用作项目文件导航或功能模块的快速切换。

6 -> 代码示例

1. 在界面上创建一个 TreeView,右键 -> 变形为 -> TreeWidget,再创建一个 lineEdit 和两个 pushButton

注意:TreeWidget 是 TreeView 的子类,功能比 TreeView 更丰富

2. 编写代码,构造初始数据

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置根节点名称ui->treeWidget->setHeaderLabel("One Piece");// 设置顶层节点QTreeWidgetItem* item1 = new QTreeWidgetItem();item1->setText(0, "海贼");// 添加到顶层节点ui->treeWidget->addTopLevelItem(item1);// 设置顶层节点QTreeWidgetItem* item2 = new QTreeWidgetItem();item2->setText(0, "革命军");// 添加到顶层节点ui->treeWidget->addTopLevelItem(item2);// 设置顶层节点QTreeWidgetItem* item3 = new QTreeWidgetItem();item3->setText(0, "海军");// 添加到顶层节点ui->treeWidget->addTopLevelItem(item3);// 添加子节点QTreeWidgetItem* item4 = new QTreeWidgetItem();item4->setText(0, "草帽海贼团");item1->addChild(item4);QTreeWidgetItem* item5 = new QTreeWidgetItem();item5->setText(0, "红发海贼团");item1->addChild(item5);QTreeWidgetItem* item6 = new QTreeWidgetItem();item6->setText(0, "黑胡子海贼团");item1->addChild(item6);QTreeWidgetItem* item7 = new QTreeWidgetItem();item7->setText(0, "龙");item2->addChild(item7);QTreeWidgetItem* item8 = new QTreeWidgetItem();item8->setText(0, "萨博");item2->addChild(item8);QTreeWidgetItem* item9 = new QTreeWidgetItem();item9->setText(0, "赤犬");item3->addChild(item9);QTreeWidgetItem* item10 = new QTreeWidgetItem();item10->setText(0, "黄猿");item3->addChild(item10);QTreeWidgetItem* item11 = new QTreeWidgetItem();item11->setText(0, "绿牛");item3->addChild(item11);}Widget::~Widget()
{delete ui;
}

3. 编写代码,实现按钮的 slot 函数

void Widget::on_pushButton_insertTopLevelItem_clicked()
{// 获取到输入框中的内容const QString text = ui->lineEdit->text();// 构造一个 QTreeWidgetItemQTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, text);// 添加到顶层节点中ui->treeWidget->addTopLevelItem(item);}void Widget::on_pushButton_insertItem_clicked()
{// 获取到当前选中的节点QTreeWidgetItem* curItem = ui->treeWidget->currentItem();if (curItem == nullptr){return ;}// 获取到输入框的内容const QString text = ui->lineEdit->text();// 构造一个 QTreeWidgetItemQTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, text);// 插入到选中节点的子节点中curItem->addChild(item);}void Widget::on_pushButton_deleteItem_clicked(){// 获取到选中的元素QTreeWidgetItem* curItem = ui->treeWidget->currentItem();if (curItem == nullptr){return ;}// 删除选中的元素, 需要先获取到父元素, 通过父元素进行删除QTreeWidgetItem* parent = curItem->parent();if (parent == nullptr){// 顶层元素int index = ui->treeWidget->indexOfTopLevelItem(curItem);ui->treeWidget->takeTopLevelItem(index);}else{// 普通元素parent->removeChild(curItem);}}

4. 执行程序,可以针对树形框进行编辑

7 -> 总结

QTreeWidget是Qt工具包中一个功能全面、上手迅速的重量级控件。它通过树形结构和多列支持,为展示和操作层级数据提供了直观的解决方案。其内置的排序、编辑、复选框和拖拽功能,极大地减少了开发者的工作量。尽管在面对超大规模数据时有其局限性,但在绝大多数桌面应用程序的界面设计中,QTreeWidget凭借其易用性和灵活性,依然是构建清晰、高效用户界面的不二之选。

感谢各位大佬支持!!!

互三啦!!!

http://www.dtcms.com/a/515303.html

相关文章:

  • MOSHELL (11) : MOSHELL 中的UNIX
  • 安洵杯2019
  • 离线环境下运行 Docker 容器编排指南
  • mapbox进阶,地图添加渐变背景色
  • Tornado + Motor 微服务架构(Docker + 测试 + Kubernetes)
  • YLOLv4
  • 实验室入门——ubuntu20.04安装ros和ros2全流程
  • uTools 最新版优化macOS 26 高 GPU 占用问题
  • wordpress如何建站拓普建站推广
  • 建筑智库免费网站商城网站开发报
  • 从埋点到用户行为分析:ClkLog 如何帮助企业读懂用户
  • 【Q-dir】QDir_x64窗口配合Mouselnc实现上一步
  • 手机网站备案密码找回的方法枣庄专业做网站
  • Oracle Database 19c 服务端(19.3)下载与安装
  • 如何使用 vxe-table 实现全键盘操作,按键切换复选框单选框的选中状态
  • AI IDE 编辑器产品销售策略:从功能宣讲到赋能用户盈利的范式转变[特殊字符]
  • K8S知识点--Node和NameSpace
  • 【开发AI】Windows安装和使用Milvus的保姆级教程
  • 【完整源码+数据集+部署教程】【零售和消费品&存货】食品分类检测系统源码&数据集全套:改进yolo11-RepNCSPELAN_CAA
  • 【Qt】文件操作/事件--mainwindow做编辑器
  • 高频低客单价产品怎么做私域?餐饮/生鲜/零售用社群运营提效37%的私域代运营方案
  • 石家庄大型网站建设做it题的网站
  • 网站建设 要维护么重庆做汉堡的餐饮公司网站
  • leetcode单链表反转
  • 【英语】listicles 是什么意思?
  • JSA变成类似vba环境给第三方软件集成IDE功能,脚本功能
  • 做外单网站亚马逊wordpress菜单分开
  • [ Java 反射机制 ]
  • 元宇宙与医疗健康的深度融合:重构诊疗、培训与健康管理新生态
  • 《算法闯关指南:优选算法--二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值