zoukankan      html  css  js  c++  java
  • 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

    总结

    没有

    做一条有理想的咸鱼
  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/Doyoung/p/14956666.html
Copyright © 2011-2022 走看看