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());
}
總結
沒有