文章目录

  • 说明
  • 代码
    • widget.h
    • widget.c
    • 源码下载
  • 遇到的问题
    • 解决方式1
    • 解决方式2
    • 操作后的显示

说明

  • 环境
    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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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.csdn.net/download/occasionally/87389132

遇到的问题

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

解决方式1

设计界面 选中UI组件treeWidget直接设置 HeaderHidden属性

解决方式2

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

操作后的显示

Qt --- QTreeWidget 树形控件实例遇到的问题相关推荐

  1. 带复选框和简单描述的Qt QTreeWidget树形控件的简单使用

    Qt QTreeWidget树形控件的简单使用 具有选择框的树形控件 具有选择框的树形控件 效果:当选中顶层的树形节点时,子节点全部被选中:当取消选中顶层树形节点时,子节点全部被取消:当选中子节点时, ...

  2. Qt QTreeWidget树形控件用法详解

    文章目录 QTreeWidget控件的创建 QTreeWidget\QTreeView的关系和区别 QTreeWidgetItem类 QTreeWidget的实际应用 1) 添加结点 2) 给结点添加 ...

  3. qt中树形控件QTreeWidget的项点击后获取该项的文本

    概述 通过点击树形控件的项,可以得到被点击的树形控件的文本,使用树形控件的信号itemPressed与所在类的槽函数绑定,通过传递参数QTreeWidgetItem和列column,在绑定的槽函数中得 ...

  4. 理解Vue递归组件,实现Tree树形控件实例~

    思考了两天时间,准备仿照ant-design-vue实现一个基于vue的树形控件.主要用到了vue递归组件思想.input的CheckBox类型输入框的使用. 需求 能够将传入的Json数据生成树形目 ...

  5. qt中创键树形控件QTreeWidget与QStackWidget相绑定

    引言 实现点击下拉列表的项对应的跳转到相应的堆栈窗口,且每个堆栈窗口中都有各自的树形控件,更换可执行文件所在目录下的文件data.json后,点击更新按钮,可以更新所有堆栈窗口的树形控件. 效果 示例 ...

  6. QT中树控件QTreeView开发实例

    转自:http://mobile.51cto.com/symbian-268700.htm 本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代 ...

  7. QT的Listwidget控件使用

    一.简介 Qt 中用于项(Item)处理的组件有两类,一类是 Item Views,包括 QListView.QTreeView. QTableView.QColumnView 等:另一类是 Item ...

  8. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  9. 树形控件Tree Control

    树形控件Tree Control 前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统 ...

最新文章

  1. Java基础—ClassLoader的理解
  2. 算法练习----java字符全排列
  3. 解决关闭hdfs yarn spark hbase时no namenode to stop异常 no master to stop
  4. 现在还有必要学Java开发吗?前景好吗?
  5. 获取图片中感兴趣区域的信息(Matlab实现)
  6. ASP.NET Core 3.0 迁移避坑指南
  7. python控制语句_Python流程控制语句
  8. 黑科技DeepFake检测方法:利用心跳做信号,还能「揪出」造假模型
  9. ShardingSphere(六) 读写分离之mysql 主从同步配置
  10. php的优化参数有哪些,php 参数优化
  11. java swing jdk_javax.swing
  12. 如何输入已经以新的TTY运行的Docker容器
  13. C++primer笔记之顺序容器
  14. Mysql高性能总结
  15. 例2.7 输出梯形 - 九度教程第14题(排版题)
  16. 星舆科技北斗高精度定位网启动北斗三号服务
  17. SRT (SubRip)字幕
  18. 扇形涂色问题(Python)
  19. js技巧收集(200多个)——2
  20. 说一说 ArrayList 的扩容机制

热门文章

  1. 【穿越百年咖啡厅Café logo,经典不败设计 】
  2. Cows(树状数组)
  3. 【起航计划 001】2015 起航计划 踏在起跑线上
  4. cartographer代码框架(谷歌最近修改之后的)
  5. JS学习笔记之面向对象 5.3
  6. Joomla目录遍历及远程代码(CVE-2021-23132)--避坑指南
  7. python 文字转语音 带情感_python文字转语音实现过程解析
  8. BZOJ 1787: [Ahoi2008]Meet 紧急集合
  9. 软件测试之安全怎么做?
  10. 涉密资质要求的保密室建设标准有哪些?