QDir类

一、核心概念

定位:Qt 对操作系统文件系统目录的封装类,核心作用是处理目录路径解析、遍历内容、切换目录、创建 / 删除目录,是文件浏览器开发的核心工具。

存储内容:

  • 核心:目录的路径字符串(绝对 / 相对 / 特殊路径,如根路径、家目录);
  • 辅助:访问 / 遍历规则(过滤规则、排序规则、文件系统行为标志);
  • 注意:不存储目录下的文件列表、文件元数据、文件内容,所有目录内容均实时从文件系统读取。

QFileInfo:

  • 定位它专门用来存储单个文件 / 目录的「元信息」(比如名称、路径、大小、类型、修改时间等)与QDir搭配着使用,你可以把它理解成:QDir负责 “遍历目录拿到所有文件 / 目录的清单”,而QFileInfo就是清单里 “每一行的详细信息”,是实现文件浏览器中 “展示文件属性、区分文件 / 目录” 的关键。
entryInfoList(const QStringList &nameFilters, QDir::Filters filters, QDir::SortFlags sort) 名称 + 类型过滤 + 排序
Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
    setWindowTitle("QDir综合应用");
    resize(500, 400);
    layout = new QVBoxLayout();
    lineEdit = new QLineEdit("/");
    fileListWidget = new QListWidget();
    layout->addWidget(lineEdit);
    layout->addWidget(fileListWidget);
    setLayout(layout);
    QString root = "/";
    QDir rootDir(root);
    QStringList strList;
    strList << "*";//匹配所有文件与目录
    QFileInfoList list = rootDir.entryInfoList(strList);//获取当前目录下所有的文件信息并存储在list当中
}

 

二、相关API

QDir(const QString &path) 构造函数,绑定路径
QDir::rootPath() 获取系统根路径
QDir::currentPath() 获取程序工作目录
setPath(const QString &path) 重置绑定的路径
absolutePath() 获取标准化绝对路径

三、目录切换

cd(const QString &subDir) 切换到子目录(相对路径)
cdUp() 返回上级目录

逻辑公式:新路径 = QDir(当前路径).cd(子目录名).absolutePath()

void Dialog::disDirShow(QListWidgetItem *item)
{
    QDir dir;//初始化一个空的目录
    QString str = item->text();//获取当前目录下一个文件的文件名
    dir.setPath(lineEdit->text());//lineEdit是当前的绝对目录
    dir.cd(str);//加上文件名,成为子目录
    lineEdit->setText(dir.absolutePath());
}

四、目录遍历

核心函数:entryInfoList(nameFilters, filters, sort)

名称过滤(nameFilters) {"*"} 匹配所有文件 / 目录
QStringList类型 {"*.png", "*.jpg"} 仅匹配图片文件
  {"test*"} 匹配以 test 开头的文件
类型过滤(filters) `QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoHidden` 显示文件 + 目录,排除 ./.. 和隐藏文件
  `QDir::Dirs | QDir::NoDotAndDotDot`  仅显示目录
   `QDir::Files | QDir::Readable` 仅显示可读文件
排序规则(sort) `QDir::DirsFirst | QDir::Name | QDir::Ascending` 目录优先、名称升序
  QDir::Size | QDir::Descending` 按文件大小降序
  QDir::Time | QDir::Ascending` 按修改时间升序
QDir dir(lineEdit->text());
QFileInfoList fileList = dir.entryInfoList(
    {"*"},  // 名称过滤:所有项
    QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoHidden,  // 类型过滤
    QDir::DirsFirst | QDir::Name | QDir::Ascending  // 排序规则
);
void Dialog::disDir(QDir dir)
{
    QStringList strlist;
    strlist << "*";//获取当前目录下的所有文件
    QFileInfoList fileinfolist = dir.entryInfoList(strlist, QDir::AllEntries, QDir::DirsFirst);
    disFileInfoList(fileinfolist);
}


void Dialog::disFileInfoList(const QFileInfoList &list)
{
    fileListWidget->clear();
    for(int i = 0; i < list.count(); ++i){
        QFileInfo file = list[i];
        if(file.isDir()){
            QString fileName = file.fileName();
            QIcon png("图片路径");
            QListWidgetItem *temp = new QListWidgetItem(png, fileName);
            fileListWidget->addItem(temp);
        }
    }
}

 

posted @ 2026-02-02 19:25  菜鸡の编程日常  阅读(0)  评论(0)    收藏  举报