首页 > 其他分享 >QT TreeWidget控件实现文件树 展示目录结构

QT TreeWidget控件实现文件树 展示目录结构

时间:2024-03-15 19:30:19浏览次数:21  
标签:控件 遍历 QT 文件 QTreeWidgetItem item TreeWidget 节点 Qt

目录

1、获取盘符,以及一级子文件

2、getFileOnDirectory函数,遍历指定文件夹的一级子文件

3、绑定展开信号和槽函数,遍历指定文件

4、QTreeWidgetItem::setData()用法


如图所示,这里仅仅实现展示目录结构,对于新增文件、修改文件、删除文件会后续补充。 

思路:这里我并没有在程序打开的时候就遍历全部的文件,因为文件太多了,全部遍历一遍需要较多的时间,导致运行程序后一时半会打不开(正在遍历全部的文件)。所以我这里采用的是:点击左侧箭头展开时,遍历一层文件。下面举例说明

第一个图是最初的情况,程序运行时只获取全部的盘符,以及这些盘符的一级子文件。如果只获取盘符,不获取一级子文件,那么左侧的箭头就不会出现。

 

当我们点击F盘左侧箭头展示时,如第二个图所示,这时需要的操作是:把F盘的一级子文件中是文件夹的选择出来,遍历每一个文件夹中的文件(不需要递归,一层就够)。比如获取到BaiduNetdiskDownload文件夹下的一级子文件。下面来看看具体代码实现

1、获取盘符,以及一级子文件

void MainWindow::initTreeWidget()
{
    ui->treeWidget->setHeaderLabel("目录结构:");

    QFileInfoList fileInfoList = QDir::drives();       // 获取全部的盘符

    // 循环遍历每一个盘符,获取这些盘符下的一级子文件
    for(QFileInfo fileInfo : fileInfoList) {
        QTreeWidgetItem* item = new QTreeWidgetItem();    // 子节点
        item->setText(0,fileInfo.path());    // 设置显示的内容,比如显示“C:/”。
        // 设置自定义数据,后续要用。每个节点要保存自身的路径,不包括自身文件名
        item->setData(0,Qt::UserRole,fileInfo.path());
        // 为false时,点击展开会获取子文件,然后改为ture,再次展开就不用添加了
        item->setData(0,Qt::UserRole+1,false);    // 设置自定义数据

        ui->treeWidget->addTopLevelItem(item);    // 把节点添加到根上

        getFileOnDirectory(item,item->text(0));   // 获取指定目录下的一级子文件
    }
}

2、getFileOnDirectory函数,遍历指定文件夹的一级子文件

void MainWindow::getFileOnDirectory(QTreeWidgetItem* item,QString directoryPath)
{
    // 创建目录对象,获取该目录下的全部文件(一级)
    QDir dir(directoryPath);
    QFileInfoList fileInfoList = dir.entryInfoList();

    // 循环遍历,给传入的item节点添加子节点
    for(QFileInfo fileInfo : fileInfoList) {
        if(fileInfo.fileName()=="." || fileInfo.fileName()=="..")
            continue;

        QTreeWidgetItem* child = new QTreeWidgetItem();
        child->setText(0,fileInfo.fileName());    // text标签显示文件名
        child->setData(0,Qt::UserRole,directoryPath);    // 记录路径
        child->setData(0,Qt::UserRole+1,false);          // 记录没有展开过
        item->addChild(child);                           // 添加到item节点上
    }
}

3、绑定展开信号和槽函数,遍历指定文件

connect(ui->treeWidget,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(expandItem(QTreeWidgetItem*)));
void MainWindow::expandItem(QTreeWidgetItem* item)
{
    if(item->data(0,Qt::UserRole+1).toBool())   // 为true,已经添加过了,不用再添加了
        return;

    item->setData(0,Qt::UserRole+1,true);

    // 遍历item节点的全部子节点,如果该子节点目录是文件夹,就获取到里面的文件
    for(int i=0;i<item->childCount();i++) {
        QTreeWidgetItem* root = item->child(i);    // 子节点
        // 获取到子节点的路径,拼接上子节点自身文件名,判断是否为文件夹
        QString file = root->data(0,Qt::UserRole).toString()+"/"+root->text(0);

        QFileInfo* fileInfo = new QFileInfo(file);
        if(fileInfo->isDir()) {
            getFileOnDirectory(root,file);    // 是文件夹就获取里面的文件,添加子节点
        }
    }
}

4、QTreeWidgetItem::setData()用法

void QTreeWidgetItem::setData(int column, int role, const QVariant &value)

1、第一个参数是列索引,QTreeWidgetItem可以有多列数据,每一列数据对应一个索引值,索引值从0开始递增。

2、第二个参数是角色,也就是数据的含义。QT预定义的角色有:Qt::DisplayRole(用于显示的角色)、Qt::EditRole(用于编辑的角色)、Qt::UserRole(用户自定义的角色)等。如果还需要更多的用户自定义角色,可以使用Qt::UserRole加上偏移用来区分不用的角色。

3、第三个参数是数据,QVariant支持很多种数据类型,可以直接传入。

4、获取data中的数据。QVariant data(int column, int role),传入对应的索引值和角色就可以获取到设置的数据,然后用to...函数把数据转为想要的数据类型。(下图截取了部分)

标签:控件,遍历,QT,文件,QTreeWidgetItem,item,TreeWidget,节点,Qt
From: https://blog.csdn.net/Zhang_Y_Q/article/details/136596469

相关文章

  • Qt QtCharts给QChartView换肤,换背景色添加背景图片
    换色setBackgroundBrush这种接口可以设置QChartView背景色首先,给QChart类去掉背景渲染:换肤1QChart*chart=newQChart();2chart->setTheme(QChart::ChartThemeLight);这里chart是你自检的chart进入枚举一共有多个,可以自己看下,那个更适合。换背景下面展示一些内联......
  • Qt Charts 自定义样式
    QtCharts是Qt框架中用于创建图表和图形可视化的模块,它提供了一些内置的图表类型,如折线图、柱状图、饼图等。如果你想要自定义QtCharts中图表的样式,你可以使用一些方法来实现。以下是一些自定义QtCharts样式的方法:1、使用QChart的样式属性: QtCharts中的QChart类具有许多属性......
  • QT QChart去掉边缘区域
     QChart默认会留白、端点处圆形化处理,需要人手修改1chart->layout()->setContentsMargins(0,0,0,0);2chart->setBackgroundRoundness(0); 修改后的效果......
  • Qt QToolButton设置icon与字体居中
    目的设置QToolButtonicon与字体居中显示,网上有挺多文章说明的,有些我设置了无效,我亲自测试了下,如下是有效果的1QToolButton{2color:#b9b9b9;3font-size:12px;4font-weight:normal;5border:2pxsolid#b9b9b9;6border-ra......
  • Qt 工具盒类实现QQ界面QToolBox
    实例:MyQQ界面新建:QtWidgetsApplication项目名称:MyQQ类名:Dialog基类:QDialog不选择“创建界面”代码及详细注释如下:【main.cpp】1#include"dialog.h"//使用哪个类就必须把包含该类的头文件引用过来(*.h文件中包含了相应类的定义)2#include<QAppli......
  • Qt 数据类型介绍
    Qt提供了一些常见的数据类型来处理各种数据,包括字符串、日期时间、颜色等。下面是一些常用的Qt数据类型及其使用例程:1.QString:用于处理字符串的类。#include<QString>#include<QDebug>intmain(){QStringstr="Hello,Qt!";qDebug()<<"StringExample......
  • Qt opengl和qlabel的update同时更新,内存泄漏问题
    工作要做一个类似播放器的软件,但是需要自己解码,然后可能多张图像合成再显示,所以不能直接用QT播放视频的模块,就用了QOpenGLWidget来渲染。后面发现内存一直在涨,一直以为是自己的原因,因为解码分配的内存挺多的,折腾了快一个月了,后面发现是update频繁更新导致;如下代码,XVideoWidget继......
  • QT 之 QCheckBox 去除边框
    以下两种方法均可去除checkBox前面的边框:方法一:如下图所示,直接在样式表上写以下代码即可,但这第一个方法有个弊端,我在安卓手机上运行后旁边会有个小黑点,不仔细看会看不出来,​​​​故除非第二个方案运行后没反应才使用此方法:效果图:方法二:如下图所示,一样也是在样式表中写......
  • 新鲜出炉!界面控件DevExpress WinForms 2024产品路线图预览(三)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!本文将介绍2024年DevExpressWinForms第一个主要更新......
  • QT网络编程之获取本机网络信息
    一.概述查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能,Qt提供了QHostInfo和QNetworkInterface类可以用于此类信息的查询1.QHostInfo类(显示和查找本地的信息)2.QNetworkInterface类(获得应用程序上所在主机的所有网络接口,包括子网掩码和广播地址) 推荐一个不错......