QTreeView 使用 QStandardItemModel
@
目錄
前言
Qt 模型視圖的講解到處都是,就不廢話了。直接說QTreeView使用QsStandardItemModel的基本用法
一、直接上圖

二、添加同級結點項
1.思路
1. 通過QTreeView的currentIndex()函數,獲取當前結點的索引
2. 通過QStandardItemModel的itemFromIndex()函數,獲取當前結點
3. 通過QStandardItem的parent()函數,獲取當前結點的父結點
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
總結
沒有
