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

Qt进阶开发:QDirModel的使用

文章目录

    • 一、QDirModel的基本介绍
    • 二、QDirModel的基本使用
      • 2.1 在 QTreeView 中显示文件系统
      • 2.2 在 QListView 显示当前目录
      • 2.3 在 QTableView 中使用
    • 三、QDirModel的常用API
      • 1. 构造 & 目录操作
        • 1.1 创建 QDirModel
        • 1.2 设置根目录
      • 2. 过滤 & 排序
        • 2.1 过滤文件类型
        • 2.2 设置排序
      • 3. 获取文件信息
        • 3.1 获取文件名
        • 3.2 获取文件完整路径
        • 3.3 判断是否是目录
        • 3.4 获取文件大小
        • 3.5 获取文件修改时间
        • 3.6 获取文件类型
      • 4. 索引操作
        • 4.1 通过路径获取 QModelIndex
        • 4.2 通过 QModelIndex 获取父目录
        • 4.3 获取子目录
      • 5. 监听文件选择
    • 四、监听文件系统变化

一、QDirModel的基本介绍

  QDirModel是 Qt 早期用于显示文件系统(目录、文件)的 QAbstractItemModel 之一,它用于配合 QTreeView 以层级结构显示文件夹和文件。需要注意的是QDirModel 在 Qt 4.6 之后被 QFileSystemModel 取代,不推荐在新项目中使用 QDirModel,应使用 QFileSystemModel 代替。
它们的主要区别:

  • QDirModel 会加载所有子目录和文件,导致大量目录时性能较差。
  • QFileSystemModel 是懒加载的,不会预加载所有子目录,性能更好。

二、QDirModel的基本使用

2.1 在 QTreeView 中显示文件系统

#include <QApplication>
#include <QTreeView>
#include <QDirModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建 QDirModel
    QDirModel model;
    model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 显示所有文件和文件夹

    // 创建 QTreeView
    QTreeView treeView;
    treeView.setModel(&model);

    // 设置根目录(桌面路径)
    QModelIndex rootIndex = model.index(QDir::homePath());  
    treeView.setRootIndex(rootIndex);

    // 显示窗口
    treeView.resize(800, 600);
    treeView.show();
    
    return app.exec();
}

在这里插入图片描述

2.2 在 QListView 显示当前目录

#include <QApplication>
#include <QListView>
#include <QDirModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建 QDirModel
    QDirModel model;
    model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

    // 创建 QListView
    QListView listView;
    listView.setModel(&model);

    // 设置要显示的目录
    listView.setRootIndex(model.index(QDir::homePath()));

    listView.show();
    return app.exec();
}

在这里插入图片描述

2.3 在 QTableView 中使用

#include <QApplication>
#include <QTableView>
#include <QDirModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建 QDirModel
    QDirModel model;
    model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

    // 创建 QTableView
    QTableView tableView;
    tableView.setModel(&model);

    // 设置要显示的目录
    tableView.setRootIndex(model.index(QDir::homePath()));

    tableView.resize(800, 600);
    tableView.show();
    
    return app.exec();
}

在这里插入图片描述

三、QDirModel的常用API

1. 构造 & 目录操作

1.1 创建 QDirModel
QDirModel *model = new QDirModel(parent);

作用:创建 QDirModel,用于显示文件系统。

1.2 设置根目录
model->setRootPath(QDir::homePath());  // 设置为用户主目录

作用:设置 QDirModel 的根目录,但不会影响 QTreeView 的 setRootIndex()。

2. 过滤 & 排序

2.1 过滤文件类型
model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

作用:控制 QDirModel 显示的文件/目录类型。
可选值:

  • QDir::Files ➝ 仅显示文件
  • QDir::Dirs ➝ 仅显示目录
  • QDir::AllEntries ➝ 显示所有(默认)
  • QDir::Hidden ➝ 显示隐藏文件
  • QDir::NoDotAndDotDot ➝ 隐藏 . 和 …
2.2 设置排序
model->setSorting(QDir::Name | QDir::IgnoreCase);

作用:控制文件/目录排序方式。
可选值:

  • QDir::Name ➝ 按名称排序
  • QDir::Size ➝ 按大小排序
  • QDir::Type ➝ 按类型排序
  • QDir::Time ➝ 按修改时间排序

3. 获取文件信息

3.1 获取文件名
QString fileName = model->fileName(index);

作用:返回 index 对应的文件名(不包含路径);如file.txt。

3.2 获取文件完整路径
QString filePath = model->filePath(index);

作用:返回 index 对应的完整路径;如/home/user/Documents/file.txt。

3.3 判断是否是目录
bool isDirectory = model->isDir(index);

作用:判断 index 是否是目录。
返回值:true ➝ 目录;false ➝ 文件。

3.4 获取文件大小
qint64 size = model->size(index);

作用:获取 index 对应的文件大小(字节)。例如返回 1024(表示 1 KB)。

3.5 获取文件修改时间
QDateTime modifiedTime = model->lastModified(index);

作用:返回 index 对应文件的最后修改时间。例如2024-04-01 12:30:45。

3.6 获取文件类型
QString fileType = model->type(index);

作用:返回文件类型描述(如 文本文件、文件夹)。例如Text File、Folder。

4. 索引操作

4.1 通过路径获取 QModelIndex
QModelIndex index = model->index("/home/user/Documents/file.txt");

作用:获取指定路径的 QModelIndex,用于 QTreeView、QListView 等。

4.2 通过 QModelIndex 获取父目录
QModelIndex parentIndex = model->parent(index);

作用:获取 index 的父目录索引。

4.3 获取子目录
QModelIndex childIndex = model->index(0, 0, index);

作用:获取 index 目录下的第一个文件/子目录。

5. 监听文件选择

QObject::connect(treeView, &QTreeView::clicked, [&](const QModelIndex &index) {
    QString filePath = model->filePath(index);
    qDebug() << "用户选择了:" << filePath;
});

四、监听文件系统变化

当某个目录被成功加载后触发。

connect(model, &QDirModel::directoryLoaded, [](const QString &path){
    qDebug() << "Directory loaded:" << path;
});

当某个文件或目录被重命名时触发。

connect(model, &QDirModel::fileRenamed, [](const QString &path, const QString &oldName, const QString &newName){
    qDebug() << "File renamed in" << path << "from" << oldName << "to" << newName;
});

当 setRootPath() 被调用,并且根目录发生改变时触发。

connect(model, &QDirModel::rootPathChanged, [](const QString &newPath){
    qDebug() << "Root path changed to:" << newPath;
});

当新的文件或目录被添加时触发。

connect(model, &QDirModel::rowsInserted, [](const QModelIndex &parent, int start, int end){
    qDebug() << "Rows inserted from" << start << "to" << end << "under parent" << parent;
});

当文件或目录被删除时触发。

connect(model, &QDirModel::rowsRemoved, [](const QModelIndex &parent, int start, int end){
    qDebug() << "Rows removed from" << start << "to" << end << "under parent" << parent;
});

注意:由于 QDirModel 在 Qt 5 中已被 QFileSystemModel 取代,建议使用 QFileSystemModel。

http://www.dtcms.com/a/109741.html

相关文章:

  • 基于S函数的simulink仿真
  • 4.2-3 fiddler抓取手机接口
  • 【C语言入门】由浅入深学习指针 【第二期】
  • Sora结构猜测
  • TypeScript 元数据操作 API 及示例
  • Unity HDRP管线用ShaderGraph还原Lit,方便做拓展;
  • 详解Pinctrl子系统
  • Redis 的 Raft 选举协议
  • 使用MFC ActiveX开发KingScada控件(OCX)
  • Mac Apple silicon如何指定运行amd64架构的ubuntu Docker?
  • 浅浅尝试Numpy的函数:
  • 【数据结构】排序算法(中篇)·处理大数据的精妙
  • git commit Message 插件解释说明
  • Ubuntu服务器挂载之前的数据硬盘
  • C++中的链表操作
  • 网络运维学习笔记(DeepSeek优化版)027 OSPF外部路由计算
  • GaussDB数据库SQL开发实践与性能优化全解析
  • 汇编学习之《jcc指令》
  • Vue 数据传递流程图指南
  • CompletableFuture:核心方法、应用场景
  • 面向对象软件开发与中国哲学的关系
  • Java面试题及答案整理( 2025年 4 月最新版,持续更新)
  • 每天10分钟!自动抓取并生成每日简报的AI方案
  • 从零开始训练Codebook:基于ViT的图像重建实践
  • 认识 Promise
  • 三、GPIO
  • 【上新了】深入理解 Java 虚拟线程:与传统线程的对比及应用
  • Vue2 监听器 watcher
  • qt tcpsocket编程遇到的并发问题
  • Spring Boot应用中实现Jar包热更新的实践指南