【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍


  • 博客主页:Duck Bro 博客主页
  • 系列专栏:Qt 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

文章编号:Qt 学习笔记 / 38

文章目录


一、QTreeWidget介绍

1. 简介

QTreeWidget是Qt中的一个可视化控件,用于显示树形结构的数据。它是QTreeView的衍生类,提供了更直观易用的API来构建和管理树形结构。

QTreeWidget可用于显示和编辑树状结构的数据,每个节点可以包含一个或多个子节点。每个节点以一个图标和一个文本标签来标识,用户可以通过展开或折叠节点来显示或隐藏子节点。

2. 核心方法

方法 说明
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 名称.

3. 核心信号

信号 说明
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) 元素被折叠时触发

二、QTreeWidgetItem介绍

1. 简介

QTreeWidgetItem是Qt框架中的一个类,用于在树形结构中表示节点。它可以用于创建树状的视图,比如树状菜单、文件浏览器等。

QTreeWidgetItem类提供了一些方法和属性,用于设置节点的文本、图标、状态等。每个节点都可以有子节点,通过添加子节点来构建树的层次结构。节点的层次关系可以通过父节点和子节点的指针来管理。

2. 核心属性

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

3. 核心方法

方法 说明
addChild(QTreeWidgetItem* child) 新增子节点
childCount() 子节点的个数
child(int index) 获取指定下标的子节点. 返回 QTreeWidgetItem*
takeChild(int index) 删除对应下标的子节点
removeChild(QTreeWidgetItem* child) 删除对应的子节点
parent() 获取该元素的父节点

三、QTreeWidget的使用(代码示例)

  1. 在界面TreeView,和三个按钮,以及一个输入框,如下图所示
  2. 使用代码添加顶层元素
cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //修改根节点名称
    ui->treeWidget->setHeaderLabel("饮品");

    //添加顶层元素
    QTreeWidgetItem * item = new QTreeWidgetItem();
    //设置顶层元素的名称
    item->setText(0,"碳酸饮料");
    //添加到顶层节点中
    ui->treeWidget->addTopLevelItem(item);

    //添加顶层元素
    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,"百事可乐");
    //添加到顶层节点下
    item->addChild(item4);

    //添加子节点
    QTreeWidgetItem * item5 = new QTreeWidgetItem();
    //设置元素名称
    item5->setText(0,"雪碧");
    //添加到顶层节点下
    item->addChild(item5);
}
  1. 编写按钮生成的槽函数
cpp 复制代码
//添加到顶层元素 按钮
void Widget::on_pushButton_insertTopLevelItem_clicked()
{
    //获取到LineEdit输入框中的内容
    const QString& text = ui->lineEdit->text();
    //新增顶层节点
    QTreeWidgetItem * item = new QTreeWidgetItem();
    //设置顶层元素名称
    item -> setText(0,text);
    //添加到顶层节点中
    ui->treeWidget->addTopLevelItem(item);
}

//添加到选中元素 按钮
void Widget::on_pushButton_insertItem_clicked()
{
    //获取到输入框内容
    const QString& text = ui->lineEdit->text();
    //获取当前选中的节点
    QTreeWidgetItem * current= ui->treeWidget->currentItem();
    if(current == nullptr)
    {
        return;
    }
    //新增节点
    QTreeWidgetItem * item = new QTreeWidgetItem();
    //设置元素名称
    item -> setText(0,text);
    //添加到节点中
    current->addChild(item);
}

//删除选中的元素 按钮
void Widget::on_pushButton_3_clicked()
{
    //获取当前选中的节点
    QTreeWidgetItem * current= ui->treeWidget->currentItem();
    if(current == nullptr){
        return;
    }
    //获取当前节点的父节点
    QTreeWidgetItem* parent = current->parent();
    if(parent ==nullptr){
        //顶层节点
        int index = ui->treeWidget->indexOfTopLevelItem(current);
        ui->treeWidget->takeTopLevelItem(index);
    }
    else{
        //非顶层节点
        parent->removeChild(current);
    }
}
  1. 运行结果,可以针对树形结构进行编辑添加内容和删除内容

相关推荐
M78佐菲1 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
恋恋西风1 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx1 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
噜~噜~噜~2 小时前
操作系统笔记-2.3.5.1.1生产者-消费者问题
笔记·操作系统
BizzZ_2 小时前
C++(22)——类型转换和IO流
开发语言·c++
yi.Ist2 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
小范同学_2 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu2 小时前
CSharp: 万年历
开发语言·后端·c#·.net
我找到地球的支点啦3 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊3 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket