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

總結

沒有


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM