QTreeView 使用 QStandardItemModel

@

前言

Qt 模型视图的讲解到处都是,就不废话了。直接说QTreeView使用QsStandardItemModel的基本用法

一、直接上图

二、添加同级结点项

1.思路

1. 通过QTreeViewcurrentIndex()函数,获取当前结点的索引

2. 通过QStandardItemModelitemFromIndex()函数,获取当前结点

3. 通过QStandardItemparent()函数,获取当前结点的父结点

4. 用父结点添加一个新结点

2.实现

代码如下:

	// 实例化一个要添加的结点
QStandardItem* item = new QStandardItem(QStringLiteral("新结点")); // 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则直接添加顶级结点
if (!curIndex.isValid())
{
pModel->appendRow(item);
return;
} // 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果当前结点的父结点为空则是顶级结点
if (!parentItem) {
pModel->appendRow(item);
}
else {
parentItem->appendRow(item);
}
// 设置添加的结点为当前结点
ui.treeView->setCurrentIndex(item->index());

二、添加子结点项

1. 思路

1. 还是先获取当前结点的索引

2. 再获取当前结点

3. 当前结点直接添加一个子结点

2. 实现

代码如下:

	// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 实例化一个要添加的结点
QStandardItem* item = new QStandardItem(QStringLiteral("新结点")); // 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 添加到子结点
curItem->appendRow(item);
// 设置添加的结点为当前结点
ui.treeView->setCurrentIndex(item->index());

三、结点项上移

1. 思路

1. 还是先获取当前结点的索引

2. 再获取当前结点

3. 判断如果当前结点已经是最上面一行了,则不做处理

4. 获取父结点

5. 父结点先移除当前结点,再把移除的结点添加到当前结点-1的位置

2.实现

代码如下:

	// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的行
int row = curItem->row();
// 如果当前结点是第0行则不做处理
if (row == 0)
{
return;
}
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果父结点无效,则当前结点是顶级结点
if (!parentItem)
{
// 用model直接操作
// 先移除当前结点,再添加到当前结点索引-1的位置
pModel->insertRow(row - 1, pModel->takeRow(row));
}
else
{
// 用父结点操作
parentItem->insertRow(row - 1, parentItem->takeRow(row));
}
// 设置当前结点
ui.treeView->setCurrentIndex(curItem->index());

四、结点项下移

1. 思路

1. 和结点上移思路一样,只不过重新添加的位置是+1

2.代码

代码如下:

// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的行
int row = curItem->row();
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果父结点无效,则当前结点是顶级结点
if (!parentItem)
{
// 用model直接操作
// 如果当前结点是最后一行则不做处理
if (row == pModel->rowCount() - 1)
{
return;
}
// 先移除当前结点,再添加到当前结点索引-1的位置
pModel->insertRow(row + 1, pModel->takeRow(row));
}
else
{
// 如果当前结点是最后一行则不做处理
if (row == parentItem->rowCount() - 1)
{
return;
}
// 用父结点操作
parentItem->insertRow(row + 1, parentItem->takeRow(row));
}
// 设置当前结点
ui.treeView->setCurrentIndex(curItem->index());

五、结点升级

1. 思路

1. 还是先获取当前结点

2. 再获取当前结点的父结点

3. 再获取父结点的父结点

4. 将当前结点从父结点移除

5. 将移除的结点添加到父结点的父结点

2.代码

代码如下:

	// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的行
int row = curItem->row();
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果父结点无效,则当前结点是顶级结点,不能再升级了,不做处理
if (!parentItem)
{
return;
}
else
{
// 获取父结点的的父结点
auto parent = parentItem->parent();
// 如果父结点 的 父结点 无效 则父结点是顶级结点,直接用model操作
if (!parent)
{
// 从父结点移除,父结点的父结点添加(添加位置随意),当前结点则成为了原本父结点的兄弟结点
pModel->insertRow(parentItem->row(), parentItem->takeRow(curItem->row()));
}
else
{
parent->insertRow(parentItem->row(), parentItem->takeRow(curItem->row()));
}
// 设置当前结点
ui.treeView->setCurrentIndex(curItem->index());
}

五、结点降级

1. 思路

1. 获取当前结点

2. 获取当前结点兄弟结点

3. 将当前结点添加到兄弟结点

2.代码

代码如下:

	// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的行
int row = curItem->row();
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果父结点无效,则当前结点是顶级结点,不能再升级了,不做处理
if (!parentItem)
{
return;
}
else
{
// 获取父结点的的父结点
auto parent = parentItem->parent();
// 如果父结点 的 父结点 无效 则父结点是顶级结点,直接用model操作
if (!parent)
{
// 从父结点移除,父结点的父结点添加(添加位置随意),当前结点则成为了原本父结点的兄弟结点
pModel->insertRow(parentItem->row(), parentItem->takeRow(curItem->row()));
}
else
{
parent->insertRow(parentItem->row(), parentItem->takeRow(curItem->row()));
}
// 设置当前结点
ui.treeView->setCurrentIndex(curItem->index());
}

五、删除结点

1. 思路

1. 获取当前结点的父结点

2. 通过父结点删除当前结点

2.代码

代码如下:

	// 当前结点的索引
auto curIndex = ui.treeView->currentIndex();
// 无效则不做处理
if (!curIndex.isValid())
{
return;
}
// 当前结点
auto curItem = pModel->itemFromIndex(curIndex);
// 当前结点的父结点
auto parentItem = curItem->parent();
// 如果父结点无效,则当前结点是顶级结点,直接使用model操作
if (!parentItem)
{
pModel->takeRow(curItem->row());
}
else
{
parentItem->takeRow(curItem->row());
}

总结

没有

QTreeView 使用 QStandardItemModel的更多相关文章

  1. 【转】Qt之模型/视图

    [本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html   作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...

  2. 11.树形Model/View实例

    任务1:显示如图的树形结构 思考: 1.使用QTreeView显示. 2.Model使用QStandardItemModel,qt的一个标准model. 3.QStandardItemModel下每一 ...

  3. qt 关于Qt中MVC的介绍与使用

    Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户.这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中. 模型 ...

  4. Qt——树的搜索实现源码

    一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...

  5. C/C++ Qt TreeWidget 嵌套节点操作技巧

    在上一篇博文<C/C++ Qt TreeWidget 单层树形组件应用>中给大家演示了如何使用TreeWidget组件创建单层树形结构,并给这个树形组件增加了右键菜单功能,接下来将继续延申 ...

  6. QStandardItemModel角色控制及QTreeView加入不同的右键菜单

    1.概述 QTreeView最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了Qt中使用标准化项目模型QSt ...

  7. QStandardItemModel角色控制及QTreeView添加不同的右键菜单

    http://blog.csdn.net/czyt1988/article/details/26018513

  8. Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置

    QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有m ...

  9. 关于QStandardItemModel

    类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据.与此不 ...

随机推荐

  1. 服务治理演进剖析 & Service Mesh、 xDS核心原理梳理

    基于XDS协议实现控制面板与数据面板通信分享 基于这段时间在同程艺龙基础架构部的蹲坑,聊一聊微服务治理的核心难点.历史演进.最新动态, 以上内容属自我思考,不代表同程艺龙技术水准.如理解有偏差.理解不 ...

  2. .NET平台系列9 .NET Core 3.0 / .NET Core 3.1 详解

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 3.0 于 2019年9月23日发布,重点是增加对同时支持使用 Windwos Forms.WPF 和 Entity Frm ...

  3. JMM——Java内存模型抽象|八种同步操作|操作规则

    JMM 调用栈&本地变量在线程栈上 对象整体在堆上(包括其本地变量,不论类型),栈有其引用即可访问, 线程调用同一个对象时,是访问该对象的私有拷贝 每个CPU有自己的高速缓存 高速缓存存在意义 ...

  4. 【Azure 云服务】Azure Cloud Service 创建 Alert 指南 [基于旧版 Alert(Classic)不可用情况下]

    问题描述 在Azure云服务(Cloud Service)创建Alert(Classic)时候遇见失败消息:"Failed to update alert testclassicalertr ...

  5. Markdown使用概述

    Markdown使用概述 序言 作为一名编程学习的爱好者和初学者,由于学习编程的过程中总是存在遗忘以及很难动手写起来的问题,所以在看了许多关于编程学习方法的文章之后,选择使用typora作为我的笔记工 ...

  6. [Linux] Linux C编程一站式学习 Part.3

    Linux系统编程 文件与I/O C标准I/O库函数与Unbuffered I/O函数 C标准I/O库函数printf().putchar().fputs(),会在用户空间开辟I/O缓冲区 系统函数o ...

  7. 攻防世界(八)web2

    攻防世界系列:web2 1.代码审计  知识补充: strrev(string):反转字符串 strlen(string):字符串长度 substr(string,start,length):截取字符 ...

  8. MyBatis 环境搭建(四)

    MyBatis 引言 在回顾JDBC时,我们已经创建有 Java 工程,而且也已经导入 mysql 依赖包,这里就直接在原有工程上搭建MyBatis环境,以及使用MyBatis来实现之前用 JDBC ...

  9. centos7网卡配置文件详解与固定服务器ip

    环境:Centos7.3(最小安装方式安装) 查看自动获取的IP地址 ip addr 更改网卡配置,配置静态IP 网卡配置文件位置:/etc/sysconfig/network-scripts/ifc ...

  10. VS Code 安装后的一些配置项

    说明: 个人一直使用Notepad++作为日常文本编辑器,由于之前出现的某个原因,故决定改用VS Code. •设置中文字体 • 输入快捷键 Ctrl+Shift+P • 输入 Configure D ...