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

总结

没有