QT树的实现

理论

在Model/View结构中,数据模型为视图组件和代理组件提供存取数据的标准接口。在QT中,所有的数据模型类都从QAbstactItemModel继承而来,不管底层的数据结构是如何组织数据的,QAbstractItemModel的子类都以表格的层次结构表示数据,视图组件通过这种规则来存取模型中的数据,但是表现给用户的形式不一样。
图5-4是数据模型的3种常见表现形式。不管数据模型的表现形式是怎么样的,数据模型中的存在数据的基本单元都是项(item), 每一个项有一个行号、一个列号,还有一个父项(parent item)。在列表和表格模式下,所有的项都有一个相同的顶层项(root item); 在树状结构中,行号、列号、父项稍微复杂一点,但是由这3个参数完全可以定义一个项的位置,从而存取项的数据。

下图就是QT官方提供的数据模型的几种表现形式:
在这里插入图片描述

实践情况

先定义一个treeModel,这也是最关键的地方:
头文件:

#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QList>
#include <QStandardItemModel>
#include <QObject>
class TreeModel
{
public:
    TreeModel(QObject *parent = nullptr);
    ~TreeModel();
    void initModel();
    QStandardItemModel* getStandardItemModel();
private:
    QStandardItemModel* m_standardItemModel;
};
#endif // TREEMODEL_H

cpp文件:

#pragma execution_character_set("utf-8")
#include "treemodel.h"
TreeModel::TreeModel(QObject *parent):m_standardItemModel(nullptr)
{
    m_standardItemModel = new QStandardItemModel(parent);
}
TreeModel::~TreeModel()
{
    if(nullptr == m_standardItemModel)
    {
        delete m_standardItemModel;
    }
}
void TreeModel::initModel()
{
    m_standardItemModel = new QStandardItemModel();
    // 2.使用model设置QTreeView表头
    QStringList strHeads = QStringList(QString::fromUtf8("姓名"));
    strHeads.append(QString::fromUtf8("性别"));
    strHeads.append(QString::fromUtf8("年龄"));
    m_standardItemModel->setHorizontalHeaderLabels(strHeads);
    QStandardItem *item1 = new QStandardItem(QString::fromUtf8("四年级"));
    m_standardItemModel->setItem(0,0,item1);
    QStandardItem *item00 = new QStandardItem(QString::fromUtf8("张三"));
    QStandardItem *item10 = new QStandardItem(QString::fromUtf8("张四"));
    QStandardItem *item20 = new QStandardItem(QString::fromUtf8("张五"));
    QStandardItem *item01 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item11 = new QStandardItem(QString::fromUtf8("女"));
    QStandardItem *item21 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item02 = new QStandardItem(QString::fromUtf8("15"));
    QStandardItem *item12 = new QStandardItem(QString::fromUtf8("14"));
    QStandardItem *item22 = new QStandardItem(QString::fromUtf8("16"));
    m_standardItemModel->item(0,0)->setChild(0,0,item00);
    m_standardItemModel->item(0,0)->setChild(1,0,item10);
    m_standardItemModel->item(0,0)->setChild(2,0,item20);
    m_standardItemModel->item(0,0)->setChild(0,1,item01);
    m_standardItemModel->item(0,0)->setChild(1,1,item11);
    m_standardItemModel->item(0,0)->setChild(2,1,item21);
    m_standardItemModel->item(0,0)->setChild(0,2,item02);
    m_standardItemModel->item(0,0)->setChild(1,2,item12);
    m_standardItemModel->item(0,0)->setChild(2,2,item22);
    QStandardItem *item2 = new QStandardItem(QString::fromUtf8("五年级"));
    m_standardItemModel->setItem(1,0,item2);
    QStandardItem *item200 = new QStandardItem(QString::fromUtf8("李三"));
    QStandardItem *item210 = new QStandardItem(QString::fromUtf8("李四"));
    QStandardItem *item220 = new QStandardItem(QString::fromUtf8("李五"));
    QStandardItem *item201 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item211 = new QStandardItem(QString::fromUtf8("女"));
    QStandardItem *item221 = new QStandardItem(QString::fromUtf8("男"));
    QStandardItem *item202 = new QStandardItem(QString::fromUtf8("15"));
    QStandardItem *item212 = new QStandardItem(QString::fromUtf8("14"));
    QStandardItem *item222 = new QStandardItem(QString::fromUtf8("16"));
    m_standardItemModel ->item(1,0)->setChild(0,0,item200);
    m_standardItemModel->item(1,0)->setChild(1,0,item210);
    m_standardItemModel->item(1,0)->setChild(2,0,item220);
    m_standardItemModel->item(1,0)->setChild(0,1,item201);
    m_standardItemModel->item(1,0)->setChild(1,1,item211);
    m_standardItemModel->item(1,0)->setChild(2,1,item221);
    m_standardItemModel->item(1,0)->setChild(0,2,item202);
    m_standardItemModel->item(1,0)->setChild(1,2,item212);
    m_standardItemModel->item(1,0)->setChild(2,2,item222);
}
QStandardItemModel *TreeModel::getStandardItemModel()
{
    return this->m_standardItemModel;
}

界面类:

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <unistd.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    treeModel = new TreeModel(this);
    treeModel->initModel();
    // 槽函数
    connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MainWindow::_on_treeView_current_changed);
    connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &MainWindow::_on_treeView_MenuPopup);
    ui->treeView->setModel(treeModel->getStandardItemModel());
    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    // 右键菜单
    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
    ui->treeView->expandAll();
}
MainWindow::~MainWindow()
{
    delete ui;
}

实现效果:
在这里插入图片描述

总结

其实这里就是这样一个类似的数据结构:
struct item{
int row;
int rank;
item parent;
QString data;
vector childrenList;

记准官方这张图,就明白怎么用了,其实,很简单:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据需要一场硬件革命

光子盒研究院 计算领域的进步往往集中在软件上&#xff1a;华丽的应用程序和软件可以跟踪人和生态系统的健康状况、分析大数据&#xff0c;并在智力竞赛中击败人类冠军。与此同时&#xff0c;对支撑所有这些创新的硬件进行全面改革的努力相对来说&#xff0c;略显小众。 自2020…

Scala里的WordCount 案例

7.7.5 普通 WordCount 案例 package chapter07object TestWordCount__简单版 {def main(args: Array[String]): Unit {//单词计数&#xff1a;将集合中出现的相同单词计数&#xff0c;进行计数&#xff0c;取计数排名的前三的结果val stringList List("Hello Scala Hbas…

【数据可视化方案分享】电商数据分析

本文所分享的电商数据分析报表均来自奥威BI软件的电商数据分析方案&#xff01;该方案是一套包含数据采集、数据建模、数据分析报表的系统化、标准化数据分析方案&#xff0c;下载套用&#xff0c;立见效果&#xff01; 注意&#xff0c;奥威BI软件的电商数据分析方案分两类&a…

【基于Django框架的在线教育平台开发-01】账号登录及退出登录功能开发

文章目录 1 模型层开发2 视图层开发3 form表单验证4 配置urls.py5 模板层开发6 效果展示 1 模型层开发 用户数据表如下所示&#xff1a; FieldTypeExtraidintPrime Key & Auto Incrementpasswordvarchar(128)last_logindatetime(6)Allow Nullis_superusertinyint(1)usern…

mysql 常见锁类型

表锁 & 行锁 在 MySQL 中锁的种类有很多&#xff0c;但是最基本的还是表锁和行锁&#xff1a;表锁指的是对一整张表加锁&#xff0c;一般是 DDL 处理时使用&#xff0c;也可以自己在 SQL 中指定&#xff1b;而行锁指的是锁定某一行数据或某几行&#xff0c;或行和行之间的…

第二章 数据处理篇:transforms

教程参考&#xff1a; https://pytorch.org/tutorials/ https://github.com/TingsongYu/PyTorch_Tutorial https://github.com/yunjey/pytorch-tutorial 详细的transform的使用样例可以参考&#xff1a;ILLUSTRATION OF TRANSFORMS 文章目录 为什么要使用transformstransforms方…

二叉树题目:单值二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;单值二叉树 出处&#xff1a;965. 单值二叉树 难度 3 级 题目描述 要求 如果二叉树每个结点都具有相同的值&am…

SQL死锁

目录 前言&#xff1a; 分析&#xff1a; 死锁产生的原因&#xff1a; sql死锁 模拟&#xff1a; 解决办法&#xff1a; (本质&#xff1a;快速筛选或高效处理、以此减少锁冲突) ①大事务拆成小事务&#xff0c;尽可能缩小事务范围 大事务:将多个操作放在一个事务中执行…

【MOOC 测验】第5章 链路层

1、局域网的协议结构一般不包括&#xff08; &#xff09; A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法&#xff0c;正确的是&#xff08; &#xff09; A. 可以检测和纠正双比特差错B…

【CVRP测评篇】 算法性能如何?来测!

我跨越了2100015秒的距离&#xff0c;为你送上更全面的算法性能评测。 目录 往期优质资源1 CVRP数据集2 实验准备2.1 计算机配置2.2 调参方法2.3 参数设定2.4 实验方法 3 实验结果3.1 最优解统计3.1.1各数据集上的算法性能对比3.1.2 求解结果汇总3.1.3小结一下3.1.4 还有话说 3…

【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

涉及知识点 分类的IP地址&#xff0c;子网划分&#xff0c;CIDR和路由汇聚&#xff0c;IPV4数据报格式&#xff0c;IPV6协议&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学…

剑指 Offer 68 - II. 二叉树的最近公共祖先 / LeetCode 236. 二叉树的最近公共祖先(搜索与回溯)

题目&#xff1a; 链接&#xff1a;剑指 Offer 68 - II. 二叉树的最近公共祖先&#xff1b;LeetCode 236. 二叉树的最近公共祖先 难度&#xff1a;中等 上一题博客&#xff1a;剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 / LeetCode 235. 二叉搜索树的最近公共祖先&#xf…

SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试8. SSH固定地址连接测试 转载自cpolar极点云文章&#xff1a;SSH远程直连Docker容器 在某些特殊需求下,我们想ssh…

机器学习李宏毅学习笔记34

文章目录 前言一、Knowledge distillation二、Parameter quantization三、Architecture design四、Dynamic computation总结 前言 神经网络压缩&#xff08;二&#xff09;其他方法 一、Knowledge distillation 先train一个大的network叫做teacher network&#xff0c;小的ne…

Vue3:计算属性、监听器

computed 计算属性 计算属性是指 基于现有状态派生 (演变) 出新的状态&#xff0c;现有状态发生变化&#xff0c;派生状态重新计算。 computed 接收回调函数作为参数&#xff0c;基于回调函数中使用的响应式数据进行计算属性的创建&#xff0c;回调函数的返回值就是基于现有状态…

壳牌小程序笔记

壳牌加油站 uni-app-基础-day01 概览 为什么要学uni-app&#xff1f; 现在很多中小型公司&#xff0c;都有自己的小程序项目&#xff0c;然后开发小程序就会用到uni-app。 uni-app没有诞生之前&#xff0c;怎么写小程序 使用原生微信小程序这个框架去开发&#xff1f; 只…

解析vcruntime140.dll文件,缺失了要怎么去修复?

在计算机的世界中&#xff0c;vcruntime140.dll是一个重要的动态链接库文件。然而&#xff0c;有时候这个文件可能会引发一系列问题&#xff0c;影响应用程序的正常运行。如果你缺少了vcruntime140.dll&#xff0c;那么你的程序就会打不开&#xff0c;今天我们一起来聊聊vcrunt…

鸟类识别Python,基于TensorFlow卷积神经网络【实战项目】

一、介绍 鸟类识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;…

Linux Ubuntu man文档的图文安装教程

文章目录 前言man文档的起源man文档的安装man文档的使用总结 前言 当提及"man文档"时&#xff0c;通常是指Unix和类Unix系统中的手册页&#xff08;man page&#xff09;&#xff0c;因为Linux是在Unix的基础上发展而来的操作系统&#xff0c;所以我们的Linux也有ma…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 &#xff1a;&#xff1a;1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…