Qt --- QTreeWidget 树形控件实例&遇到的问题

QT QTreeView\QTreeWidget控件 使用详解 本文详细的介绍了QTreeView、QTreeWidget控件的各种操作,例如:新建界面、控件布局、设置列、设置宽高、设置列表头、设置复选框、设置图标、添加树、删除树、查找树、修改树、设置选中、树排序、事件、信号、槽函数、添加节点、默认选中、.h源文件、cpp源文件、其它文章等等操作。实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。布局管理器可以完成两件事:自动调整控件的位置,包括控件之间的间距、对齐等; 阅读详情

说明

  • 环境
    Qt软件版本 : 5.9.9
    实例参考书籍 : Qt5开发及实例 陆文周
    系统 : Win10 专业版

  • QTreeWidget 树形控件实例
    选中树形控件的父节点 或者 取消树形控件的父节点 子节点跟随父节点状态;
    子节点单独选中, 父节点在半选中状态;

代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QTreeWidgetItem>     

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void init();
    void updateParentItem(QTreeWidgetItem* item);

public slots:
    void treeItemChanged(QTreeWidgetItem* item, int column);

private:
    Ui::Widget *ui;

};
#endif // WIDGET_H

widget.c

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    init();
    /* itemChanged() 当指定项中列的内容发生更改时,会发出此信号 */
    connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem* , int)), this , SLOT(treeItemChanged(QTreeWidgetItem* , int)) );
}

Widget::~Widget()
{
    delete ui;
}

void Widget::init()
{
    ui->treeWidget->clear(); //* clear() 清除树内部的所有项选择

    ui->treeWidget->setHeaderHidden(true); //* 设置隐藏treeWidget表头显示

    //第一个分组
    QTreeWidgetItem *group1 = new QTreeWidgetItem(ui->treeWidget);
    group1->setText(0,"group1");
    group1->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    group1->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem11 = new QTreeWidgetItem(group1);
    subItem11->setText(0,"subItem11");
    subItem11->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem11->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem12 = new QTreeWidgetItem(group1);
    subItem12->setText(0,"subItem12");
    subItem12->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem12->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem13 = new QTreeWidgetItem(group1);
    subItem13->setText(0,"subItem13");
    subItem13->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem13->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem14 = new QTreeWidgetItem(group1);
    subItem14->setText(0,"subItem14");
    subItem14->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem14->setCheckState(0,Qt::Unchecked);

    //第二个分组
    QTreeWidgetItem *group2 = new QTreeWidgetItem(ui->treeWidget);
    group2->setText(0,"group2");
    group2->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    group2->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem21 = new QTreeWidgetItem(group2);
    subItem21->setText(0,"subItem21");
    subItem21->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem21->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem22 = new QTreeWidgetItem(group2);
    subItem22->setText(0,"subItem22");
    subItem22->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem22->setCheckState(0,Qt::Unchecked);

    QTreeWidgetItem *subItem23 = new QTreeWidgetItem(group2);
    subItem23->setText(0,"subItem23");
    subItem23->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    subItem23->setCheckState(0,Qt::Unchecked);
}

void Widget::updateParentItem(QTreeWidgetItem* item) //* 判断并设置父节点的状态
{
    QTreeWidgetItem *parent = item ->parent(); //* parent() 返回项目的父级
    if(parent == NULL)
    {
        return;
    }
    /* 统计选中的子节点的个数 */
    int selectedCount = 0;
    int childCount = parent->childCount();  //* childCount() 返回子项目的数量

    for (int i = 0; i < childCount; i++)
    {
        QTreeWidgetItem *childItem =  parent->child(i);
        if(childItem->checkState(0) == Qt::Checked)
        {
            selectedCount++;
        }
    }
   /* 根据选中的子节点的个数 更新父节点的状态 */
    if(selectedCount <= 0)
    {
        parent->setCheckState(0, Qt::Unchecked);
    }
    else if(selectedCount > 0 && selectedCount < childCount)
    {
        //部分选中状态
        parent->setCheckState(0, Qt::PartiallyChecked);
    }
    else if(selectedCount == childCount)
    {
        //未选中状态
        parent->setCheckState(0, Qt::Checked);
    }
}

void Widget::treeItemChanged(QTreeWidgetItem* item, int column)
{
    QString itemText = item ->text(0);
    //选中时
    if(Qt::Checked == item ->checkState(0))
    {
        QTreeWidgetItem* parent = item ->parent();
        int count = item ->childCount(); // 获取子部件数目
        if(count > 0) //判断是否有子节点
        {
            for (int i = 0; i < count; i++)
            {
                //子节点也选中 有的话将下面子节点全部选中
                item ->child(i) ->setCheckState(0, Qt::Checked);
            }
        }
        else
        {
            //是子节点
            updateParentItem(item);
        }
    }
    else if(Qt::Unchecked == item->checkState(0))
    {
        int count = item ->childCount();
        if(count > 0)
        {
            for (int i = 0; i < count; i++)
            {
                item ->child(i) ->setCheckState(0, Qt::Unchecked);
            }
        }
        else
        {
            updateParentItem(item);
        }
    }
}

源码下载

https://download.youkuaiyun.com/download/occasionally/87389132

遇到的问题

在使用Qt treeWidget 控件时发现总会出现表头显示1(如图片), 在ui中删除无效, 发现可以通过下列方式解决。
请添加图片描述

解决方式1

设计界面 选中UI组件treeWidget直接设置 HeaderHidden属性
请添加图片描述

解决方式2

  1. 程序中使用 setHeaderHidden() 设置; 在界面构造函数中添加下面语句;
    ui->treeWidget->setHeaderHidden(true);

操作后的显示

请添加图片描述

【Qt笔记】QTreeWidget控件详解 QTreeWidget 是 Qt 框架中用于展示层次化数据的一个非常强大的控件,它继承自 QAbstractItemView 和 QTreeView,但提供了更为简便的接口来管理树形结构的数据。 阅读详情

相关推荐

关于treeWidget的相关用法:

如何将treewidget的默认值1去掉呢?ui->treeWidget->clear(); // 清空树形数据 ui->treeWidget->setHeaderLabels(header_list); // 添加表头ui->treeWidget->setHeaderHidden(false); // 是否隐藏表头 ui->treeWidget->setColumnCount(header_list.length()); // 设置树形的列数 ui->treeWidget->setColumnWidth(

qq_54046639的博客 668

Qt中QTreeWidget树控件

已经设置好了ui界面,不要使用Tree View控件,这个需要学习MySQL这类数据库才可以使用.使用Tree Widget。

qq_42677487的博客 663

Qt QTreeWidget树形控件用法详解_qt 树控件

图 1 是树形结构的一个典型示例,MyFirstQt 项目的内部构成一目了然,项目内部包含一个 MyFirstQt.pro 项目文件和 3 个文件夹,每个文件夹中包含哪些文件也都可以清楚地看到。作为一款成熟的 GUI 框架,Qt 提供了 QTreeWidget 树形控件,专门用来以树形结构显示数据。

2501_90433399的博客 1940

Qt QTreeWidget的级联选中

在使用QTreeWidget显示文件树时,需要对树的节点做一些功能的限制: 勾选某一节点时,该节点的子项自动全部选中 子项部分勾选时,父节点状态为部分勾选 子项全部勾选时,父节点自动设置勾选 首先,查看了Qt文档,发现竟然没有提供这个功能,所以自己写了一个简单的例子。 QTreeWidget在添加节点时,其节点前面的复选框默认时不显示的,而要显示复选框,我们则需要通过QTreeWidgetItem的方法来设置。 void QTreeWidgetItem::setCheckState(int column

slowlytalk 3312

Qt QTreeWidget(树形控件)的用法

Qt QTreeWidget 新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下: 添加代码 //test.h //在头文件里添加两个公用函数还有一个槽函数的声明 #include public: void initTreeWidget(); void updateParentItem(QTreeWidge

LittleMouse 1万+

【QT】QTreeWidget控件的使用

本文介绍QTreeWidget控件的使用,包括QTreeWidget控件常用功能接口和实例功能介绍,且与相应的资源绑定,可进行调试学习。

u011671745的博客 3137

Qt QTreeWidget树形控件用法详解

Qt QTreeWidget树形控件用法详解 QTreeWidget 是 Qt 框架提供的一种树形控件,它能以树形结构展示数据(或者文件)之间的包含关系。举个简单的例子,下图是我们创建好的一个 Qt 项目: 图 1 树形结构 图 1 是树形结构的一个典型示例,MyFirstQt 项目的内部构成一目了然,项目内部包含一个 MyFirstQt.pro 项目文件和 3 个文件夹,每个文件夹中包含哪些文件也都可以清楚地看到。 作为一款成熟的 GUI 框架,Qt 提供了 QTreeWidget 树形控件,专门用来以

ccc369639963的博客 2万+

Qt QTreeWidget树形控件用法详解_qt 树控件(1)

已剪辑自: http://c.biancheng.net/view/vip_9659.htmlQTreeWidget 是 Qt 框架提供的一种树形控件,它能以树形结构展示数据(或者文件)之间的包含关系。举个简单的例子,下图是我们创建好的一个 Qt 项目:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMzezztO-1669280924164)(http://c.biancheng.net/uploads/allimg/211028/16394RH8-0.gif)]

2401_87019153的博客 1447

Qt之QTreeWidget添加节点获取节点

Qt之QTreeWidget添加节点获取节点概述:代码示例:.h.cpp效果图:over:文末一句话: 概述: QTreeWidget 类根据预设的模型提供树形显示控件。 QTreeWidget 使用类似于 QListWidget 类的方式提供一种典型的基于 item 的树形交互方法类,该类基于QT的“模型/视图”结构,提供了默认的模型来支撑 item 的显示,这些 item 类为 QTreeWi...

weixin_43519792的博客 2万+

2024年Qt QTreeWidget树形控件用法详解_qt 树控件,2024年最新深入理解Nginx

除此之外,还有其它添加结点的方法,例如使用Qt 对 C++ STL 库中的容器进行了更好的封装,QList 容器就是其中之一。通过先将 item 和 item2 添加到 items 容器中,然后再将 items 传递给 treeWidget 对象的 addTopLevelItems() 方法,就可以将 items 容器中的所有结点添加到 treeWidget 控件中,作为该控件的顶层结点。

2401_85012504的博客 1118

【QT开发】树形控件QTreeWidget类详解及实战应用

QTreeWidget是Qt提供的一个功能强大且灵活的树形控件类,通过本篇文章的学习,你应该对QTreeWidget有了全面的理解,能够在自己的项目中正确使用它。QTreeWidget在用户界面中帮助你更好地展示和管理层次化数据,实现交互式和响应式的数据展示,有助于创建用户友好和高效的目录树浏览器、项目管理工具等应用场景。

科技改变人类,技术成就未来 2792

[QT_012]Qt学习之QTreeWidget 详解

QTreeWidget

kongcheng253的博客 1万+

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 442

Qt5 QTreeWidget使用 创建具有多级联动和复选框的树形控件

​ 通过使用树形控件QTreeWidget创建具有联动功能的和复选框树形控件,实现勾选一个(选中),其父节点也会改变相应的状态(且父亲节点会迭代修改状态),弥补参考文章的不足之处,创建工作中更加有效且实用的控件。 文章目录本博文的简述or解决问题?功能实现:思路架构:运行演示:源码下载:细节方面:参考博文: 编程环境: win10 x64 专业版 编程软件: visual studio 2...

6844

【Fluent】太阳辐射模型—Solar Ray Tracing

一、引言Fluent提供了一个太阳能负载模型,可用于计算进入计算域的太阳光线的辐射效应。该模型可以分为:太阳光线追踪和太阳辐照。其中太阳辐照需要使用DO或MC模型,直接向辐射模型提供外光束方向和强度参数。太阳光线追踪不限制辐射模型,可以独立于辐射方程使用,甚至可以在辐射模型off的情况下使用。本文主要介绍太阳光线追踪模型。该模型非常适用于以下领域汽车气候控制 (ACC) 应用建筑物中的人体热舒适建模应用该模型使用着色算法进行太阳光线追踪。光线会透过半透明的面加载在照射面上。

a5567899的博客 7590

Spring Boot整合Apache Hop 2.3.0实战:从零搭建数据管道(附完整代码)

本文详细介绍了如何在Spring Boot项目中整合Apache Hop 2.3.0,从零开始构建可嵌入的数据管道。内容涵盖环境初始化、依赖配置、管道设计,并通过完整代码示例演示了如何通过REST API触发执行,实现数据同步与ETL流程的自动化管理,为微服务架构提供灵活的数据集成方案。

web99的专栏 632

07-Qt QTreeWidget树形控件用法详解

通过先将 item 和 item2 添加到 items 容器中,然后再将 items 传递给 treeWidget 对象的 addTopLevelItems() 方法,就可以将 items 容器中的所有结点添加到 treeWidget 控件中,作为该控件的顶层结点。图 2 中显示的数字 1,是 QTreeWidget 控件中的表头,默认情况下 QTreeWidget 只有一个表头,表头的内容就是 1。这里给大家举个简单的例子,实际场景中当某个结点的复选框被选中时,它的所有子结点也应该同时被选中。

king_ink的博客 1114

电池管理系统(BMS)系列(四)—数据采集之温度

属于BMS系列文章,介绍了电池包温度采集相关方式

zxx52113140的博客 5458

Qt 树形控件 QTreeView QTreeWidget深入剖析

通过上面的分析,用QTreeWidget在数据量不是特别大的时候,用着是没什么问题的。QTreeWidget为了兼容各种情况,已经写的很灵活了,但如何更高效呢?答案就是定制化,这样就减少了一部分灵活性。如何定制化呢?核心就是重写,Qt已经给了我们一个很好的实例,可以自己看一下这个例子,笔者这里实现的也是在这个例子基础上改的,添加了TreeItem和TreeModel两个类。TreeItem:对应了树的一行,每一列的数据存储在成员中,同时还存储父和子TreeModel:重新实现关键函数。

hao1183716597的专栏 3484

UE4_后期处理六—夜视仪、扫描线

观察下面一组蓝图节点的效果:当把角色的自定义深度通道开启:画面效果如图:这样我们就得到了一个这样的黑白蒙版。

Growthofnotes的博客 1734

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

ProceduralMan的博客 7410
上一篇: BAT (CMD) ---- 使用笔记
下一篇: Qt --- 创建一个新工程 & HelloWord
Evans_Y
博客等级 码龄10年 282粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值