QFileSystemModel详解和使用

QFileSystemModel 提供了一个可用于访问本机文件系统的数据模型。
QFileSystemModel 和视图组件 QTreeView 结合使用,可以用目录树的形式显示本机上的文件系统,如同 Widnows 的资源管理器一样。使用 QFileSystemModel 提供的接口函数,可以创建目录、删除目录、重命名目录,可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。
QFileSystemModel 使用一个单独的线程来查询文件和目录以便于填充模型数据,因此它不会在查询文件系统时导致主线程挂起。

类型成员

  1. enum QFileSystemModel::Option
  • DontWatchForChanges:不要向路径添加文件观察者。当将模型用于行编辑完成等简单任务时,这会减少开销。
  • DontResolveSymlinks:不解析文件系统模型中的符号链接。
  • DontUseCustomDirectoryIcons:始终使用默认目录图标。一些平台允许用户设置不同的图标。自定义图标会对网络或可移动驱动器的性能产生重大影响。
  1. enum QFileSystemModel::Roles
  • FileIconRole:Qt::DecorationRole
  • FilePathRole:Qt::UserRole + 1
  • FileNameRole:Qt::UserRole + 2
  • FilePermissions:Qt::UserRole + 3

函数

函数说明
QIcon fileIcon(const QModelIndex &index) const返回存储在模型中给定索引下的项目的图标
QFileInfo fileInfo(const QModelIndex &index) const
QString fileName(const QModelIndex &index) const返回存储在模型中给定索引下的项目的文件名
QString filePath(const QModelIndex &index) const返回存储在模型中给定索引下的项目的文件路径
QDir::Filters filter() const
QFileIconProvider *iconProvider() const返回此目录模型的文件图标提供程序。
QModelIndex index(const QString &path, int column = 0) const返回此目录模型的文件图标提供程序。
bool isDir(const QModelIndex &index) const判断节点是不是一个目录
bool isReadOnly() const
QDateTime lastModified(const QModelIndex &index) const返回上次修改索引的日期和时间。
QModelIndex mkdir(const QModelIndex &parent, const QString &name)返回上次修改索引的日期和时间。
QVariant myComputer(int role = Qt::DisplayRole) const返回上次修改索引的日期和时间。
bool nameFilterDisables() const
QStringList nameFilters() const
QFileSystemModel::Options options() const
QFile::Permissions permissions(const QModelIndex &index) const
bool remove(const QModelIndex &index)从文件系统模型中删除模型项索引并从文件系统中删除相应的文件,如果成功则返回true。 如果无法删除该项目,则返回 false。
bool resolveSymlinks() const
bool rmdir(const QModelIndex &index)删除文件系统模型中模型项索引对应的目录,并从文件系统中删除对应的目录,成功则返回true。 如果无法删除目录,则返回 false。
QDir rootDirectory() const当前设置的目录。
QString rootPath() const当前设置的根路径。
void setFilter(QDir::Filters filters)设置模型的过滤器。请注意,设置的过滤器应始终包含 QDir::AllDirs 枚举值,否则 QFileSystemModel 将无法读取目录结构。
void setIconProvider(QFileIconProvider *provider)
void setNameFilterDisables(bool enable)
void setNameFilters(const QStringList &filters)设置名称过滤器以应用于现有文件。
void setOption(QFileSystemModel::Option option, bool on = true)如果 on 为true,则设置要启用的给定选项; 否则,清除给定的选项。
void setOptions(QFileSystemModel::Options options)
void setReadOnly(bool enable)
void setResolveSymlinks(bool enable)
QModelIndex setRootPath(const QString &newPath)设置观察的目录为 newPath。 对该目录中文件和目录的任何更改都将反映在模型中。如果路径发生更改,将发出 rootPathChanged() 信号。
qint64 size(const QModelIndex &index) const返回索引的字节大小。 如果文件不存在,则返回 0。
bool testOption(QFileSystemModel::Option option) const如果启用了给定的选项,则返回 true,否则返回 false。
QString type(const QModelIndex &index) const返回文件索引的类型,例如“目录”或“JPEG 文件”(“Directory” or “JPEG file”)。

使用

显示并设置过滤器

model = new QFileSystemModel(this);
QString rootpath = QCoreApplication::applicationDirPath();
rootpath = rootpath.left(rootpath.lastIndexOf("/"));
model->setRootPath(rootpath+"/Data_Files/ModuleTest");
// 设置过滤器
QStringList filter;
filter <<"*.xml" /* <<"*.png" << "*.jpg" << "*.bmp" << "*.gif" <<"*.ini" <<"*.txt" <<"*.py"*/ ;
model->setNameFilters(filter);//QStringList()<<"*1v1*.xml"
// 没有通过过滤器的文件disable还是隐藏,true为disable false为隐藏
model->setNameFilterDisables(false);
ui->treeView->setAnimated(false);
ui->treeView->setModel(model);
ui->treeView->header()->setSortIndicator(0,Qt::AscendingOrder);       //按第1列升序排序
ui->treeView->header()->setDefaultAlignment(Qt::AlignCenter);         //设置表头默认文字对齐
ui->treeView->setColumnWidth(0,1500);
ui->treeView->setRootIndex(model->index(rootpath+"/Data_Files/ModuleTest"));
ui->treeView->setSortingEnabled(true);
ui->treeView->setHeaderHidden(true);
ui->treeView->show();

QDir::Filters

  • QDir::Dirs:列出与筛选器匹配的目录。
  • QDir::AllDirs:列出所有目录;即不将过滤器应用于目录名。
  • QDir::Files:列出文件。
  • QDir::Drives:List disk drives (ignored under Unix).
  • QDir::NoSymLinks:不要列出符号链接
  • QDir::NoDotAndDotDot:不要列出特殊条目“.”和“…”。
  • QDir::NoDot:不要列出特殊条目“.”。
  • QDir::NoDotDot:不要列出特殊条目“…”。
  • QDir::AllEntries:列出目录、文件、驱动器和符号链接
  • QDir::Readable:列出应用程序具有读取访问权限的文件。Readable值需要与Dirs或Files组合使用。
  • QDir::Writable:列出应用程序具有写访问权限的文件。“Writable”值需要与“Dirs”或“Files”组合使用。
  • QDir::Executable:列出应用程序具有执行访问权限的文件。Executable值需要与Dirs或Files组合使用。
  • QDir::Modified:仅列出已修改的文件
  • QDir::Hidden:列出隐藏文件
  • QDir::System:列出系统文件
  • QDir::CaseSensitive:过滤器应区分大小写。

QDir::Dirs显示目录文件夹。QDir::AllDirs非目录文件夹也会显示。QDir::NoDotAndDotDot表示其它文件夹不以.或…显示。

model->setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);

隐藏后面几列:

ui->treeView->setColumnHidden(columnIndex,True);

查找

    QPushButton* pBtnTmp = new QPushButton();
    connect(pBtnTmp,&QPushButton::clicked,ui->lineEdit_filter,&QLineEdit::clear);
    pBtnTmp->setFlat(true);
    pBtnTmp->setIcon(QIcon("://Resource/delete.svg"));
    QHBoxLayout* pEditTmpLayout = new QHBoxLayout(ui->lineEdit_filter);
    pEditTmpLayout->setSpacing(0);
    pEditTmpLayout->setMargin(0);
    pEditTmpLayout->addWidget(pBtnTmp);
    pEditTmpLayout->setAlignment(pBtnTmp,Qt::AlignVCenter | Qt::AlignRight);
    connect(ui->lineEdit_filter,&QLineEdit::textChanged,this,[&](const QString& t){
        model->setNameFilters(QStringList()<<QString("*%1*.xml").arg(t));
    });

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QFileSystemModel是一个模型/视图架构中的模型类,用于展示本地文件系统的目录结构。在默认情况下,QFileSystemModel是单线程读取文件目录的,因此如果文件目录较大或者文件数量众多时,可能会出现卡顿等问题。 为了解决这个问题,可以使用多线程来读取文件目录。具体的做法是,创建一个QThread的子类,在run()函数中执行QFileSystemModel的setRootPath()函数,并将其挂起(wait)直到目录的读取完成。然后在主线程中使用QFileSystemModel的setModel()函数将读取的结果设置到QTreeView中展示出来。 下面是一个使用多线程读取文件目录的示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QTreeView from PyQt5.QtCore import QThread, pyqtSignal, Qt from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QFileSystemModel class DirScanner(QThread): # 定义信号,用于通知主线程扫描完成 scanFinished = pyqtSignal() def __init__(self, model, path): super(DirScanner, self).__init__() self.model = model self.path = path def run(self): # 扫描目录 self.model.setRootPath(self.path) # 等待目录扫描完成 while self.model.canFetchMore(): self.model.fetchMore() self.model.sort(0, Qt.AscendingOrder) # 发射信号,通知主线程扫描完成 self.scanFinished.emit() class MainWindow(QTreeView): def __init__(self): super(MainWindow, self).__init__() # 创建模型 self.model = QFileSystemModel() # 设置模型的根路径 self.model.setRootPath("C:\\") # 创建线程对象 self.scanner = DirScanner(self.model, "C:\\") # 连接线程的信号 self.scanner.scanFinished.connect(self.onScanFinished) # 启动线程 self.scanner.start() def onScanFinished(self): # 设置模型 self.setModel(self.model) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在这个示例代码中,我们新建了一个MainWindow类,继承自QTreeView,并在其构造函数中创建了一个QFileSystemModel的对象,并设置其根路径为"C:\\"。然后,我们创建了一个DirScanner的线程类,并将QFileSystemModel的对象和扫描路径作为参数传递给线程类的构造函数。在DirScanner类的run()函数中,我们执行了QFileSystemModel的setRootPath()函数,然后等待目录扫描完成。最后,我们发射了scanFinished信号,通知主线程扫描完成。在MainWindow类的构造函数中,我们创建了DirScanner的对象,并连接了其scanFinished信号。最后,我们启动了线程并显示窗口。当线程扫描完成后,onScanFinished()函数将被调用,我们在其中将QFileSystemModel的对象设置到QTreeView中,展示出文件系统的目录结构。 需要注意的是,多线程读取文件目录需要注意线程安全问题,例如保证线程安全地访问模型类等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值