• QTreeView 使用 QStandardItemModel


    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());
    	}
    

    项目源码

    骗个分
    https://download.csdn.net/download/ShiShiSoLo/19943087

    总结

    没有

    做一条有理想的咸鱼
  • 相关阅读:
    hadoop学习--搜索引擎面临的数据和计算难题
    解析excel
    sql批量入库
    tomcat-nginx配置
    友链
    Vue+ElementUI搭建一个后台管理框架
    OnePill本地保存用户的结构
    Android集成JPush(极光推送)
    Android三种风格的底部导航栏
    Android实现EditText插入表情、超链接等格式
  • 原文地址:https://www.cnblogs.com/Doyoung/p/14956666.html
Copyright © 2020-2023  润新知