qt使用QTreeWidget实现一个树结构显示数据

2023-10-29

 

效果图

#include <QTreeWidget>
#include <QVBoxLayout>
#include <QStatusBar>
#include <QList>
class TreeView :public QTreeWidget
{
public:
    TreeView(QWidget *pParent = nullptr) :QTreeWidget(pParent) {}
    ~TreeView() {};
};

class TreeFrame :public QFrame
{
    Q_OBJECT
public:
    TreeFrame(QWidget *pParent = nullptr);
    ~TreeFrame();
    void initUI();
    void initWidgetItem();
    void connectSlots();
    //改变选中状态时同步子节点
    void syncChildNodeCheckState(QTreeWidgetItem *parentItem, Qt::CheckState state);
    //改变选中状态时同步父节点
    void syncParentNodeCheckState(QTreeWidgetItem *item);
protected slots:
    //勾选节点的信号
    void itemClicked(QTreeWidgetItem *pItem, int nCol);


private:
    TreeView *m_pTreeView;
    QTreeWidgetItem *m_pWidgetItem;
    QStatusBar *m_pBar;
    const static int m_STypeRole = Qt::UserRole;

    //节点类型
    enum NodeType
    {
        NT_RootNode = 0,
        NT_ChildNode,
        NT_ChildToChild
    };
};

TreeFrame::TreeFrame(QWidget *pParent /*= nullptr*/) :QFrame(pParent)
{
    initUI();
    initWidgetItem();
    connectSlots();
}

TreeFrame::~TreeFrame()
{
    if (m_pTreeView)
    {
        delete m_pTreeView;
        m_pTreeView = nullptr;
    }
    if (m_pWidgetItem)
    {
        delete m_pWidgetItem;
        m_pWidgetItem = nullptr;
    }
}

void TreeFrame::initUI()
{
    this->setWindowTitle("Window Title");
    m_pTreeView = new TreeView(this);
    m_pTreeView->setHeaderHidden(true);
    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addWidget(m_pTreeView, 10000);  //弹簧比例放大到10000倍
    mainLayout->setSpacing(14);

    QVBoxLayout* totalLayout = new QVBoxLayout();
    totalLayout->setMargin(0);
    totalLayout->setSpacing(0);
    mainLayout->setContentsMargins(16, 16, 16, 6);
    totalLayout->addLayout(mainLayout, 1);
    m_pBar = new QStatusBar;
    m_pBar->setFixedHeight(15);// 高度不能小于15个像素
    m_pBar->setProperty("transparent", true);// 一定要设置属性
    totalLayout->addWidget(m_pBar);
    this->setLayout(totalLayout);
    this->setMaximumHeight(200);
    this->setMinimumWidth(100);

}

void TreeFrame::initWidgetItem()
{
    m_pWidgetItem = new QTreeWidgetItem();
    m_pWidgetItem->setText(0, "All Tree");
    m_pWidgetItem->setCheckState(0, Qt::Unchecked);
    m_pWidgetItem->setData(0, m_STypeRole, NT_RootNode);
    m_pTreeView->addTopLevelItem(m_pWidgetItem);
                            //模拟数据,随便写的
    for (int i = 0; i < 5; ++i)
    {
        QTreeWidgetItem *pItem = new QTreeWidgetItem();
        pItem->setText(0, "ChildeOne");
        pItem->setFlags(pItem->flags() | Qt::ItemIsUserCheckable);
        pItem->setCheckState(0, Qt::Unchecked);
        pItem->setData(0, m_STypeRole, NT_ChildNode);
        m_pWidgetItem->addChild(pItem);
        for (int j = 0; j < 5; ++j)
        {
            //节点下还有节点
            QTreeWidgetItem *pItemChild = new QTreeWidgetItem();
            pItemChild->setText(0, "ChildeTwo");
            pItemChild->setFlags(pItemChild->flags() | Qt::ItemIsUserCheckable);
            pItemChild->setCheckState(0, Qt::Unchecked);
            pItemChild->setData(0, m_STypeRole, NT_ChildToChild);
            pItem->addChild(pItemChild);
        }
    }
    m_pTreeView->expandAll();  //展开所有节点
}

void TreeFrame::connectSlots()
{
    connect(m_pTreeView, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(itemClicked(QTreeWidgetItem *, int)));
}

void TreeFrame::syncChildNodeCheckState(QTreeWidgetItem *parentItem, Qt::CheckState state)
{
    if (parentItem != NULL && !parentItem->isHidden())
    {
        parentItem->setCheckState(0, state);
        for (int i = 0; i < parentItem->childCount(); i++)
        {
            syncChildNodeCheckState(parentItem->child(i), state);
        }
    }
}

void TreeFrame::syncParentNodeCheckState(QTreeWidgetItem *item)
{
    if (!item)
        return;

    QTreeWidgetItem *pParentItem = item->parent();
    if (!pParentItem)
        return;

    int nCheckedNum = 0;
    Qt::CheckState eState = Qt::Unchecked;
    //遍历节点改变节点选中状态
    for (int i = 0; i < pParentItem->childCount(); i++)
    {
        switch (pParentItem->child(i)->checkState(0))
        {
        case Qt::Checked:
            eState = Qt::PartiallyChecked;
            nCheckedNum++;
            break;
        case Qt::PartiallyChecked:
            eState = Qt::PartiallyChecked;
            break;
        case Qt::Unchecked:
            break;
        default:
            break;
        }
    }
    if (nCheckedNum == pParentItem->childCount())
    {
        eState = Qt::Checked;
    }
    pParentItem->setCheckState(0, eState);

    //同步一下节点状态
    syncParentNodeCheckState(pParentItem);
}

void TreeFrame::itemClicked(QTreeWidgetItem *pItem, int nCol)
{
    if (nCol != 0)
        return;

    Qt::CheckState eState = pItem->checkState(nCol);
    //子节点同步选择状态
    if (eState == Qt::Unchecked)
    {
        syncChildNodeCheckState(pItem, Qt::Unchecked);
    }
    else if (eState == Qt::Checked)
    {
        syncChildNodeCheckState(pItem, Qt::Checked);
    }
    //父节点同步
    syncParentNodeCheckState(pItem);
}

 

#include "qtWidget.h"
#include <QtWidgets/QApplication>
#include "treeView.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TreeFrame Frame;
    Frame.show();
    return a.exec();
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt使用QTreeWidget实现一个树结构显示数据 的相关文章

随机推荐

  • 解决The valid characters are defined in RFC 7230 and RFC 3986

    解决方法 一 更换低版本的Tomcat 我选的方案 二 参考 https blog csdn net qq 32365919 article details 82055800
  • GD32F103,ADC采样端口对电压的影响问题,未解决!!!(已解决!!!)

    设计采集卡 使用了ADC1 ADC2 ADC3 发现ADC采样的通道电压不对 模拟量输入端未0V 输出采用LM358跟随 在ADC采集过程中 发现LM358的输出电压并不为0V 而是为0 2V 开始以为线路短路或是LM358的问题 后来停止
  • spring实战笔记

    Environment中获取配置 方式一 直接getProperties获取String bootstrapServers env getProperty hello kafka bootstrap servers 方式二 将属性直接绑定到
  • 二、Python基本语法

    二 基本语法 一 说明 二 内容 1 注释 2 变量 3 数据类型 4 列表和字典 5 输入和输出 6 字符串操作 7 运算符 8 条件语句 9 循环语句 10 函数 11 匿名函数 12 类和对象 13 模块和包 14 异常处理 15 文
  • Windows下配置cygwin/cmake

    对于那些低配置的电脑 要在windows做一些简单的coding work 安装一个VS实在有些转不开 所以我首先想到了通过cygwin cmake配置一个简单的开发环境 对于我那台老旧的IBM T43完全没问题 1 安装cygwin 首先
  • 新Android病毒出现 自动下载且无法卸载

    不久前XcodeGhost的事情令大家还未平复 现在又有针对Android平台的新病毒被曝光 国家计算机病毒应急处理中心监测发现 一种新的感染安卓手机的病毒a expense GhostPush a出现 该病毒可自动下载安装其他APP 而且
  • windows安装VMware虚拟机(附带CentOS7部署)

    软件下载 链接 https pan baidu com s 1Vw2Bilf9uf EYR6 MR86aA pwd d2qr 提取码 d2qr VMware安装 通你上述链接下载VMware安装包 没有特别选项 选安装位置无脑下一步安装 安
  • linux工具之sar

    sar System Activity Reporter 系统活动情况报告 是目前 Linux 上最为全面的系统性能分析工具之一 可以从多方面对系统的活动进行报告 包括 文件的读写情况 系统调用的使用情况 磁盘 I O CPU 效率 内存使
  • python写入文件的几种方式_python文本文件读写的3种方法

    第一种方法 file1 open test txt file2 open output txt w while True line file1 readline 这里可以进行逻辑处理 file2 write line s if not li
  • 华为硬件工程师社招机考题库_华为校招_硬件技术工程师机考试题及答案

    1 判断题 DRAM 上电时存储单元的内容是全 0 而 Flash 上电时存储单元的内容是全 1 4 分 A 正确 B 错误 FLASH 可保存 2 判断题 眼图可以用来分析高速信号的码间 干扰 抖动 噪声和衰减 4 分 A 正确 B 错误
  • VUE element-ui之table表格横向展示(表尾汇总)

    产品需求 在正常表格下方进行一系列汇总 如 合计等 分析之后发现需要拼接一个或多个横向排列的表格 实现步骤 模板部分
  • 合并二叉排序树

    描述 先序建立两棵二叉排序树 采用二叉链表结构存储 将这两棵二叉排序树合并成一棵新的二叉排序树 并按照中序序列输出合并后的二叉排序树 输入 输入两行先序遍历的整型数据 并以此分别建立两棵二叉排序树 其中整型数据必须为大于等于零的整数 如输入
  • Moba游戏帧同步的技术原理与重点难点

    一 帧同步的技术原理 帧同步是通过在数据传输过程中插入同步字节或同步信号来保证数据的同步 它主要通过以下几个步骤实现 对啦 这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白 也有一些正在从事游戏开发的技术大佬 欢迎你来交流学习
  • <逆波兰表达式求值>

    描述 给你一个字符串数组 tokens 表示一个根据 逆波兰表示法表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 注意 有效的算符为 和 每个操作数 运算对象 都可以是一个整数或者另一个表达式 两个整数之间的除法总是 向零截
  • Linux装jdk并配置环境详细步骤

    Linux装jdk并配置环境详细步骤 1 创建文件使用命令mkdir usr local jdk 2 通过xshell传上来的文件都在 root目录下通过命令ls可以查看然后需要移动文件移动文件位置mv jdk 8u161 linux x6
  • Java——接口与实现类

    目录 接口 实现接口 常用接口 java util Comparator Arrays sort Object arr Comparator c 常用接口 java lang Comparable Arrays sort Object ar
  • Appuploader 常见错误及解决方法

    问题解决秘籍 1 遇到问题 第一个请登录苹果开发者官网 检查一遍账号是否有权限 是否被停用 是否过期 是否有协议需要同意 并且在右上角切换账号后检查所有关联的账号是否工作正常 apple账号的邮箱也是个重要的地方 当有ipa上传 账号有发生
  • 搭建SpringCloud项目,并实现自动化部署

    在当今云计算时代 微服务架构已经成为企业开发的常见选择 而SpringCloud作为Java领域中最为流行的微服务框架之一 其提供的各种组件能够帮助开发者快速搭建微服务应用 本文将介绍如何搭建SpringCloud项目 并实现自动化部署 一
  • sessionStorage和localStorage的区别

    今天就来说一下sessionStorage和localStorage的区别以及使用 sessionStorage 内存 sessionStorage大约能存储5M左右 生命周期 浏览器窗口关闭就自动销毁 属性方法 存储数据 sessionS
  • qt使用QTreeWidget实现一个树结构显示数据

    效果图 include