Qt实现自定义目录添加到导航树(导航树存在目录追加,不存在创建)
### 前言
有不同的目录,需要在导航区进行层级显示,经过分析,有以下几种情况需要处理:
1. 导航区不存在目录,则直接在根节点进行创建
如: 目录 1/2/3,在导航区不存在,则创建后为
1
|__2
|__3
2. 导航区存在该目录,则直接忽略
3. 导航区存在部分目录,则在存在的最后一层目录下,创建之后不存在的目录
如:目录 1/2/3/4,在导航区已经存在了 1/2/3,则在3的节点下创建4,显示为
1
|__2
|__3
|__4
而不是,又创建一遍1/2/3/4
实现
经过分析可知,由于目录是动态的,所以得递归进行查找。
首先,模拟一组目录:
QStringList slPath = {"/1/2/3.txt",
"/1/3/4.txt",
"/2/3/5.txt",
"/2/4/6.txt",
"/1/5/8/9.txt",
"/2/7.txt",
"/2/7.txt"};
之后,根据该目录进行导航区的查找:
for (const QString& var : slPath) {
QTreeWidgetItem* pItem = ui->treeWidget->invisibleRootItem();
int nIndex = 0; // 记录查找到当前目录的哪一层级
QStringList sl = var.split('/');
for (const QString& strSplit : sl) {
if(strSplit.isEmpty()) {
++nIndex;
continue;
}
QTreeWidgetItem* pFindItem = findItem(pItem, strSplit);
if(pFindItem) {
++nIndex;
pItem = pFindItem;
} else {
break;
}
}
// 创建
for(int i = nIndex; i < sl.count(); ++i){
QTreeWidgetItem* pItemTmp = new QTreeWidgetItem(QStringList(sl.at(i)));
pItem->addChild(pItemTmp);
pItem = pItemTmp;
}
}
下面是findItem(QTreeWidgetItem *pParentItem, const QString &strText)
的实现:
QTreeWidgetItem *MainWindow::findItem(QTreeWidgetItem *pParentItem, const QString &strText)
{
for(int i = 0; i < pParentItem->childCount(); ++i){
if(pParentItem->child(i)->text(0) == strText){
return pParentItem->child(i);
}
}
return nullptr;
}
结果
显示如下: