QT树的实现

news2024/9/22 3:43:18

理论

在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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt中多线程的使用

前言 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事件&a…

快速幂的理解、leetcode剑指 Offer 16. 数值的整数次方解析

0、引言 算法小计&#xff1a;本文阐述以下自己对于快速幂的理解&#xff0c;之前想了很久没想通。 对于求一个数字a的n次方问题&#xff1a;&#xff0c;如果直接写循环&#xff0c;从1开始每次乘以a&#xff0c;求n次即可做出答案&#xff0c;但时间复杂度是O(n)&#xff0c…

陌陌聊天数据分析 (二)

陌陌聊天数据分析 &#xff08;二&#xff09; &#x1f3c6;FineBI构建连接 陌陌聊天数据分析 &#xff08;一&#xff09; 新建连接 配置连接 测试连接并保存 &#x1f3c5;数据准备 新建分组 添加业务包 添加表 &#x1f948;构建可视化报表 &#x1f3c8;添加…

国内好用的五款低代码平台,你用的哪一款?

随着信息化技术的发展&#xff0c;软件开发领域也在不断更新迭代&#xff0c;在企业数字化升级的浪潮中&#xff0c;低代码平台的应用也越来越广泛。从业务系统到办公软件&#xff0c;从 BI分析到移动开发&#xff0c;越来越多的企业和IT团队开始使用低代码平台来构建数字化应用…

【Nginx】第六章 Nginx配置实例-动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开&#xff0c;不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开&#xff0c;可以理解成使用Nginx 处理静态页面&#xff0c;Tomcat处理动态页面。动静分离从目前实现角度来讲大致分…

超分布检测中的平衡能量正则化损失

文章目录 Balanced Energy Regularization Loss for Out-of-distribution Detection摘要本文方法Balanced Energy regularization loss 实验结果 Balanced Energy Regularization Loss for Out-of-distribution Detection 摘要 在超分布(out of distribution, OOD)检测领域&a…

express 获取阿里云 oss 文件对象列表

使用 ali-oss 包 pnpm add ali-oss -S 创建 oss 实例&#xff0c;并拉取数据 阿里云 oss 返回示例&#xff1a;

一种接口依赖关系分层方案 | 京东云技术团队

1、背景 到店商详迭代过程中&#xff0c;需要提供的对外能力越来越多&#xff0c;如预约日历、附近门店、为你推荐等。这其中不可避免会出现多个上层能力依赖同一个底层接口的场景。最初采用的方案是对外API入口进来后获取对应的能力&#xff0c;并发调用多项能力&#xff0c;…

【Vue】组件高级

文章目录 组件高级一、watch 监听器二、组件的生命周期2.1 组件运行的过程2.2 监听组件的不同时刻2.3 监听组件的更新2.4 主要生命周期函数 三、组件之间的数据共享3.1 组件关系及数据共享3.2 父子组件数据共享3.3 兄弟组件数据共享3.4 后代组件数据共享3.5 vuex 四、全局配置 …

基于Thinkphp6框架全新UI的AI网址导航系统源码

✨ 源码介绍 2023全新UI的AI网址导航系统源码&#xff0c;基于thinkphp6框架开发的 AI 网址导航是一个非常实用的工具&#xff0c;它能够帮助用户方便地浏览和管理自己喜欢的网站。 相比于其他的 AI 网址导航&#xff0c;这个项目使用了更加友好和易用的 ThinkPHP 框架进行搭建…

基于3×3耦合器的干涉型光纤传感器信号解调技术研究-Matlab代码

一、引言 光纤耦合器是一种使光信号在特殊结构的耦合区内发生耦合&#xff0c;将功率再分配的无源器件。它在光纤传感和光通信等领域有着广泛的应用&#xff0c;在耦合过程中&#xff0c;光信号的频谱成分不变&#xff0c;只是信号的光功率发生变化。1980年&#xff0c;K&…

2023双态IT北京用户大会回顾(二) | 云内外一体化智能监控构建之路

文末附有本场专题演讲视频 2023第五届双态IT北京用户大会擎创科技专场演讲回顾&#xff08;二&#xff09;&#xff1a;《云内外一体化智能监控构建之路》演讲嘉宾&#xff1a;擎创科技产品线总监 殷传旺 一、前言&#xff1a;企业运维自然推进or独立发展&#xff1f; 我们从…

WebAssembly能否取代Docker?

“如果WebAssembly&#xff08;Wasm&#xff09;在几年前出现&#xff0c;Docker可能就不会出现了。因为它是一项非常强大的跨平台技术&#xff0c;可以让我们使用不同的编程语言来编写跨平台应用程序。Docker的原始动力之一就是提供一个跨平台部署和应用的方法。” -- Solomon…

lesson6 ZIgbee网络特性抓包分析

目录 ZIgbee网络特性抓包分析 理论部分&#xff1a; 实验部分&#xff1a; 入网前相关数据帧&#xff08;仅单个设备供电&#xff09;&#xff1a; 首先以路由器和协调器为例&#xff1a;&#xff08;帧的类别从头部的Type可以看到&#xff0c;在四大帧类别中根据不同作用也…

Vue 项目build打包发布到github pages ,刷新页面首页正常打开,子路由报错404的解决方法

一、问题效果如下&#xff1a; 二、解决方法 1、切换到gh-pages分支 2、在index.html同级新增404.html文件&#xff0c;其内容与index.html一样 三、解决后的效果如下&#xff1a; 相关文章 Vue3 Vite Ts开源后台管理系统模板 基于ElementUi或AntdUI再次封装基础组件文档 基…

Java版本spring cloud 电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

VueX用法快速回顾(简洁纯干货)

vuex基础结构 代码结构 vuex的完整结构长这样&#xff0c;其包含了state、mutations、actions、modules及getters5个部分。 import Vue from vue import Vuex from vuexVue.use(Vuex)const store new Vuex.Store({state: {},mutations: {},actions:{},modules:{},getters:{…

mysql数据库 查询出的字段值是 科学计数法数字,数字转换为易于理解的形式

目录 1 问题2 实现 1 问题 数据库查询出来的可能是这种&#xff0c;如何将数字转换为易于理解的形式&#xff1b; 2 实现

ppt文件全部删除怎么恢复?别急,这些方法能挽救

PPT文件全部删除怎么恢复&#xff1f;如果您不小心将PPT文件删除&#xff0c;不要担心&#xff0c;您可能还有机会将其恢复。在下面的文章中&#xff0c;我们将介绍一些技巧来恢复已删除的PPT文件。 第一部分&#xff1a;关于PPT文件 PPT文件是指Microsoft PowerPoint软件创建…

互联网医院开发|互联网医院系统源码技术实现

健康医疗这几年一直成为人们比较关注的问题&#xff0c;互联网医院系统通过信息化技术精简了预约挂号&#xff0c;优化了医生的诊断流程&#xff0c;通过互联网医疗&#xff0c;患者复诊或医疗咨询需求都可以在线上进行&#xff0c;这种快捷的线上问诊方式缓解一线医务人员的压…