当前位置: 首页 > article >正文

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

结果

显示如下:
image.png


http://www.kler.cn/news/362753.html

相关文章:

  • 离散数学实验二c语言(输出关系矩阵,输出矩阵性质,输出自反闭包,对称闭包,传递闭包,判断矩阵是否为等价关系,相容关系,偏序关系)
  • 前端学习---(3)js基础-1
  • 世界前沿思想升命学说:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪
  • 基于YOLO的钢材缺陷检测系统设计与实现
  • Transformer 与 CNN的对比
  • 【银河麒麟高级服务器操作系统-实例】集群存储文件系统异常,本地复现+详细分析+解决建议
  • Scala的内部对象
  • Python基于TensorFlow实现GRU-Transformer回归模型(GRU-Transformer回归算法)项目实战
  • Java安全编程:公钥加密和私钥签名的实践指南
  • 地方门户分类信息网站源码系统 用户可以自由发帖 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
  • 2024前端html5,css3面试题总汇
  • 在Ubuntu上部署MQTT服务器的详细指南
  • JavaScript完整笔记
  • 列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换
  • 【Qt】QTableView添加下拉框过滤条件
  • 华为无线路由器设置成交换机
  • SpringBoot项目ES6.8升级ES7.4.0
  • STM32G474使用TIM2触发DAC输出输出正弦波
  • uniapp使用webView打开的网页有缓存如何解决(APP,微信小程序)
  • HarmonyOS鸿蒙分布式文件操作的时候权限问题
  • Rust中的Sync特征:确保多线程间安全共享数据
  • 软件工程--需求分析与用例模型
  • Python包——Matplotlib
  • C++STL之list
  • 探索卷积层参数量与计算量
  • MySQL--基本介绍