Qt MVC示例 simpletreemodel 树模型

news/2024/2/29 4:23:43

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;//更新行号}
}

https://www.xjx100.cn/news/3118919.html

相关文章

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

this.$nextTick与this.$set,解决拖拽表格没有刷新问题!

一&#xff1a;this.$nextTick的用法 将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它&#xff0c;然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样&#xff0c;不同的是回调的 this 自动绑定到调用它的实例上。 原因是&#xff0c;Vue是异步执行DOM更…

【华为OD题库-048】拔河比赛-java

题目 公司最近准备进行拔河比赛&#xff0c;需要在全部员工中进行挑选。选拔的规则如下: 1.按照身高优先、体重次优先的方式准备比赛阵容 2.规定参赛的队伍派出10名选手 请实现一个选拔队员的小程序。 输入为一个数组&#xff0c;记录了部门人员的身高、体重信息&#xff0c;如…

Android系统分析

Android工程师进阶第八课 AMS、WMS和PMS 一、Binder通信 【Android Framework系列】第2章 Binder机制大全_android binder-CSDN博客 Android Binder机制浅谈以及使用Binder进行跨进程通信的俩种方式&#xff08;AIDL以及直接利用Binder的transact方法实现&#xff09;_bind…

Rust多线程任务,发现有些线程一直获取不到锁【已解决】

问题描述 项目中用到rust&#xff0c;其中在多线程中用到了同一个对象的锁&#xff0c;然而发现其中一个线程一直拿不到这个锁。 解决过程 我先是在线程A中加入了sleep方法&#xff0c;这样做的效果就是&#xff0c;比最初好一些&#xff0c;但是拿到锁还是要较长时间&#xf…

PC企业微信http协议接口调用,发送小程序

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

Spring不再支持Java8了

在今天新建模块的时候发现了没有java8的选项了&#xff0c;结果一查发现在11月24日&#xff0c;Spring不再支持8了&#xff0c;这可怎么办呢&#xff1f;我们可以设置来源为阿里云https://start.aliyun.com/ 。 java8没了 设置URL为阿里云的地址

《尚品甄选》:后台系统——分类品牌和规格管理(debug一遍)

文章目录 一、分类品牌管理1.1 表结构介绍1.2 列表查询1.3 添加功能1.4 修改功能1.5 删除功能 二、商品规格管理2.1 表结构介绍2.2 列表查询2.3 添加功能2.4 修改功能2.5 删除功能 一、分类品牌管理 分类品牌管理就是将分类的数据和品牌的数据进行关联&#xff0c;分类数据和品…