欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > Qt进阶开发:QDirModel的使用

Qt进阶开发:QDirModel的使用

2025/4/5 10:57:54 来源:https://blog.csdn.net/TechNomad/article/details/146966178  浏览:    关键词: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);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 显示所有文件和文件夹// 创建 QTreeViewQTreeView 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);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);// 创建 QListViewQListView 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);// 创建 QDirModelQDirModel model;model.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);// 创建 QTableViewQTableView 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。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词