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

總結

沒有