Qt MVC示例 simpletreemodel 树模型

Qt MVC示例 simpletreemodel 树模型

从文本中读取树模型数据,缩进代表子项
在这里插入图片描述

TreeItem

表示一行字符串数据

treeitem.h

#ifndef TREEITEM_H
#define TREEITEM_H#include <QList>
#include <QVariant>//! [0]
class TreeItem
{
public:explicit TreeItem(const QList<QVariant> &data, TreeItem *parentItem = 0);~TreeItem();void appendChild(TreeItem *child);TreeItem *child(int row);int childCount() const;int columnCount() const;QVariant data(int column) const;int row() const;TreeItem *parentItem();private:QList<TreeItem*> m_childItems;QList<QVariant> m_itemData;TreeItem *m_parentItem;
};
//! [0]#endif // TREEITEM_H

treeitem.cpp

/*treeitem.cppA container for items of data supplied by the simple tree model.
*/#include <QStringList>#include "treeitem.h"//! [0] 当前项数据data,父项parent
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{m_parentItem = parent;m_itemData = data;
}
//! [0]//! [1]
TreeItem::~TreeItem()
{qDeleteAll(m_childItems);
}
//! [1]//! [2] 添加子项
void TreeItem::appendChild(TreeItem *item)
{m_childItems.append(item);
}
//! [2]//! [3] 子项,通过行索引返回
TreeItem *TreeItem::child(int row)
{return m_childItems.value(row);
}
//! [3]//! [4] 子项数
int TreeItem::childCount() const
{return m_childItems.count();
}
//! [4]//! [5] 列数
int TreeItem::columnCount() const
{return m_itemData.count();
}
//! [5]//! [6] 列数据,索引每一列的字符串单词
QVariant TreeItem::data(int column) const
{return m_itemData.value(column);
}
//! [6]//! [7] 父项
TreeItem *TreeItem::parentItem()
{return m_parentItem;
}
//! [7]//! [8] 默认返回0行,代表Item 只是1项
int TreeItem::row() const
{if (m_parentItem)return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));return 0;
}
//! [8]

TreeModel

树模型

treemodel.h

#ifndef TREEMODEL_H
#define TREEMODEL_H#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>class TreeItem;//! [0]
class TreeModel : public QAbstractItemModel
{Q_OBJECTpublic:explicit TreeModel(const QString &data, QObject *parent = 0);~TreeModel();QVariant data(const QModelIndex &index, int role) const override;Qt::ItemFlags flags(const QModelIndex &index) const override;QVariant headerData(int section, Qt::Orientation orientation,int role = Qt::DisplayRole) const override;QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const override;QModelIndex parent(const QModelIndex &index) const override;int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;private:void setupModelData(const QStringList &lines, TreeItem *parent);TreeItem *rootItem;
};
//! [0]#endif // TREEMODEL_H

treemodel.cpp

/*treemodel.cppProvides a simple tree model to show how to create and use hierarchicalmodels.
*/#include "treeitem.h"
#include "treemodel.h"#include <QStringList>//! [0]
TreeModel::TreeModel(const QString &data, QObject *parent): QAbstractItemModel(parent)
{QList<QVariant> rootData;rootData << "Title" << "Summary";rootItem = new TreeItem(rootData);setupModelData(data.split(QString("\n")), rootItem);
}
//! [0]//! [1]
TreeModel::~TreeModel()
{delete rootItem;
}
//! [1]//! [2]
int TreeModel::columnCount(const QModelIndex &parent) const
{if (parent.isValid())return static_cast<TreeItem*>(parent.internalPointer())->columnCount();elsereturn rootItem->columnCount();
}
//! [2]//! [3]
QVariant TreeModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();if (role != Qt::DisplayRole)return QVariant();TreeItem *item = static_cast<TreeItem*>(index.internalPointer());return item->data(index.column());
}
//! [3]//! [4]
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{if (!index.isValid())return 0;return QAbstractItemModel::flags(index);
}
//! [4]//! [5]
QVariant TreeModel::headerData(int section, Qt::Orientation orientation,int role) const
{if (orientation == Qt::Horizontal && role == Qt::DisplayRole)return rootItem->data(section);return QVariant();
}
//! [5]//! [6]
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)const
{if (!hasIndex(row, column, parent))return QModelIndex();TreeItem *parentItem;if (!parent.isValid())parentItem = rootItem;elseparentItem = static_cast<TreeItem*>(parent.internalPointer());TreeItem *childItem = parentItem->child(row);if (childItem)return createIndex(row, column, childItem);elsereturn QModelIndex();
}
//! [6]//! [7]
QModelIndex TreeModel::parent(const QModelIndex &index) const
{if (!index.isValid())return QModelIndex();TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());TreeItem *parentItem = childItem->parentItem();if (parentItem == rootItem)return QModelIndex();return createIndex(parentItem->row(), 0, parentItem);
}
//! [7]//! [8]
int TreeModel::rowCount(const QModelIndex &parent) const
{TreeItem *parentItem;if (parent.column() > 0)return 0;if (!parent.isValid())parentItem = rootItem;elseparentItem = static_cast<TreeItem*>(parent.internalPointer());return parentItem->childCount();
}
//! [8]void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent)
{QList<TreeItem*> parents;//父项QList<int> indentations;//代表行缩进索引位置parents << parent;indentations << 0;//默认缩进0位置int number = 0;//当前行号while (number < lines.count()) {int position = 0;//当前行的列索引while (position < lines[number].length()) {if (lines[number].at(position) != ' ')break;position++;}QString lineData = lines[number].mid(position).trimmed();if (!lineData.isEmpty()) {// Read the column data from the rest of the line.QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);QList<QVariant> columnData;for (int column = 0; column < columnStrings.count(); ++column)columnData << columnStrings[column];if (position > indentations.last()) {//表示遇到缩进,即是新的子项// The last child of the current parent is now the new parent// unless the current parent has no children.if (parents.last()->childCount() > 0) {//当前父项最后一个子项添加为父项parents << parents.last()->child(parents.last()->childCount()-1);indentations << position;//更新行索引位置}} else {while (position < indentations.last() && parents.count() > 0) {//返回上一级parents.pop_back();indentations.pop_back();}}// Append a new item to the current parent's list of children.parents.last()->appendChild(new TreeItem(columnData, parents.last()));}++number;//更新行号}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何手工获取并更新ESXi中macOS的VMware Tools版本

正文共&#xff1a;1128 字 22 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何在VMware ESXi创建macOS虚拟机&#xff08;VMware ESXI部署macOS Monterey&#xff09;&#xff0c;也大概介绍了如何安装VMware Tools&#xff0c;因为VMware Tools可以提供对虚…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理3. 模型训练及保存4. 模型测试1&#xff09;前端2&#xff09;后端 系统测试1. 测试效果2. 模型应用1&#…

从零开始:PHP实现阿里云直播的简单方法!

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…

“rhdf5filters.so’ not found when install ‘glmGamPoi‘ package

在R中安装glmGamPoi包的时候&#xff0c;出现了如下报错&#xff1a; install.packages(glmGamPoi) 尝试方案一&#xff1a; sudo apt install pkg-config libhdf5-dev安装lighdf5-dev&#xff0c;并将安装路径链接至usr/lib/文件。 locate rhdf5filters.so sudo ln -s /hom…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问A…

数据结构---树

树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 有一个特殊的结点&#xff0c…

纹理烘焙:原理及实现

纹理烘焙是计算机图形学中常见的技术&#xff0c;用于将着色器的细节传输到纹理中。 如果你的着色器计算量很大&#xff0c;但会产生静态结果&#xff0c;例如&#xff0c;这非常有用。 复杂的噪音。 NSDT在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器…

msyql迁移到mongodb

关系型数据库迁移到mongodb的理由 高并发需求&#xff0c;关系型数据库不容易扩展 快速迭代 灵活的json模式 大数据量需求 应用迁移难度&#xff1a; 关系型到关系 oracle-》mysql oracle -》 postgresql 关系到文档- oracle -》 mongodb 需要考虑&#xff1a; 总体架构&#…

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术&#xff0c;在各个科学和工程领域发挥着关键作用&#xff0c;其应用范围从信号处理到量子力学。近年来&#xff0c;它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …

同旺科技 分布式数字温度传感器

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…

一套后台管理系统的入门级的增删改查(vue3组合式api+elemment-plus)

一、页面示意&#xff1a; 图一 图二 二、组件结构 列表组件 &#xff1a;index.vue,对应图一添加组件&#xff1a;add.vue&#xff0c;对应图二&#xff0c;用抽屉效果编辑组件&#xff1a;edit.vue&#xff0c;和添加组件的效果一个。 三、代码 1、列表组件: index.vue …

代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 503.下一个更大元素II class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:res [-1] * len(nums)stack []for i in…