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

二、添加同级结点项
1.思路
1. 通过QTreeView的currentIndex()函数,获取当前结点的索引
2. 通过QStandardItemModel的itemFromIndex()函数,获取当前结点
3. 通过QStandardItem的parent()函数,获取当前结点的父结点
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的更多相关文章
- 【转】Qt之模型/视图
[本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html 作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...
- 11.树形Model/View实例
任务1:显示如图的树形结构 思考: 1.使用QTreeView显示. 2.Model使用QStandardItemModel,qt的一个标准model. 3.QStandardItemModel下每一 ...
- qt 关于Qt中MVC的介绍与使用
Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户.这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中. 模型 ...
- Qt——树的搜索实现源码
一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...
- C/C++ Qt TreeWidget 嵌套节点操作技巧
在上一篇博文<C/C++ Qt TreeWidget 单层树形组件应用>中给大家演示了如何使用TreeWidget组件创建单层树形结构,并给这个树形组件增加了右键菜单功能,接下来将继续延申 ...
- QStandardItemModel角色控制及QTreeView加入不同的右键菜单
1.概述 QTreeView最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了Qt中使用标准化项目模型QSt ...
- QStandardItemModel角色控制及QTreeView添加不同的右键菜单
http://blog.csdn.net/czyt1988/article/details/26018513
- Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置
QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有m ...
- 关于QStandardItemModel
类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据.与此不 ...
随机推荐
- log日志重复输出问题(没弄明白原因)
在别的模块调用定义好的函数 输出的日志出现第一次输出输出一条,第二次输出输出两条...的情况 最后在定义函数处remove了句柄 引用了https://blog.csdn.net/huilan_sam ...
- Java关键字(八)——synchronized
synchronized 这个关键字,我相信对于并发编程有一定了解的人,一定会特别熟悉,对于一些可能在多线程环境下可能会有并发问题的代码,或者方法,直接加上synchronized,问题就搞定了. 但 ...
- SSM框架整合(Spring+SpringMVC+Mybatis)
第一步:创建maven项目并完善项目结构 第二步:相关配置 pom.xml 引入相关jar包 1 <properties> 2 <project.build.sourceEncod ...
- 如何设计一个高性能 Elasticsearch mapping
目录 前言 mapping mapping 能做什么 Dynamic mapping dynamic=true dynamic=runtime dynamic=false dynamic=strict ...
- [DB] Memcache
什么是Memcache Redis的前身 严格来说只能叫缓存,不支持持久化,停电后数据丢失 Strom.Spark Streaming实时计算的结果一般会保存在Redis中 JDBC是性能瓶颈 关系型 ...
- Linux下ftp搭建
FTP服务器搭建教程: https://blog.csdn.net/plssmile/article/details/17061271 https://blog.csdn.net/guofengdid ...
- python基础之列表、元组
一.列表 列表(list)是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[ ]内可以有多个任意类型的值,逗号 ...
- java并发编程工具类JUC第一篇:BlockingQueue阻塞队列
Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列.换句话说,当多线程同时从 JavaBlocking ...
- Django优雅集成MongoDB
Django优雅集成MongoDB 将Django与MongoDB集成 在不更改Django ORM的情况下,将MongoDB用作Django项目的后端数据库.使用Django Admin在Mon ...
- 解决maven依赖冲突问题
解决maven依赖冲突问题 1.idea 安装maven helper插件 2.打开pom.xml文件 底部多出一个Dependency Analyzer选项 点开这个选项 找到冲突,点击右键,选择E ...