目录浏览器
QDirModel 是 Qt 中用于展示文件系统目录结构的模型类。它继承自 QAbstractItemModel,用于提供数据和操作接口,以便在视图组件(如 QTreeView、QListView)中显示文件系统的目录结构。
QDirModel 提供了以下功能和特性:
- 展示目录结构:QDirModel 可以展示文件系统的目录结构,包括文件夹和文件。它以树形结构的形式呈现,每个节点代表一个文件夹或文件。
- 自动刷新:QDirModel 支持自动刷新,可以监测文件系统的变化,并自动更新模型中的数据。例如,当文件或文件夹被创建、删除或重命名时,QDirModel 会及时反映这些变化。
- 排序和过滤:QDirModel 可以根据文件名进行排序,并支持根据文件类型或其他属性进行过滤。这样,您可以根据需要定制显示的文件和文件夹。
- 数据获取:QDirModel 提供了获取文件和文件夹的相关信息的接口。您可以通过模型索引获取文件名、路径、文件大小、修改时间等信息。
- 文件操作:QDirModel 支持文件操作,如复制、移动、删除文件和文件夹。通过 QFileSystemModel 的接口,您可以方便地对文件系统进行操作。
以下是 QDirModel 的一些常用方法和函数:
- rowCount(): 返回指定父节点下的行数。
- columnCount(): 返回模型的列数。
- index(): 返回指定行、列和父节点的模型索引。
- parent(): 返回给定模型索引的父节点索引。
- data(): 返回模型索引的数据,如文件名、文件路径等。
- flags(): 返回模型索引的标志,用于指定索引的可用操作。
- setData(): 设置模型索引的数据,如修改文件名等。
- mkdir(): 创建一个新文件夹。
- remove(): 删除指定文件或文件夹。
用于获取磁盘文件目录的数据模型类还有QFileSystemModel,但是QFileSystemModel采用单独的线程获取目录文件结构,QDirModel不使用单独的线程。使用单独的线程就不会阻碍主线程,所以推荐使用QFileSystemModel。
(QDirModel属于Qt自带的model,通过先了解model的用法,以及数据如何存取。然后再学习自定义model,自定义model用法和QDirModel是一样的。只不过QDirModel提供了文件系统标准的数据,所以Qt给提供为标准模块了。而我们自定义model数据样式繁多,所以需要我们自己实现。)
SelectionMode继承自QAbstractionView类,该类是所有使用了QAbstractItemModel的标准视图的基本类,从它名字就可以看出,它是一个抽象类(自身不能被实例化),通过信号与槽机制为其与模式之间的相互操作提供一个标准接口,使子类能根据模式的变化保持最新。
类型 | 值 | 描述 |
---|---|---|
NoSelection | 0 | 不能选择项 |
SingleSelection | 1 | 只能选择一项,选中项与当前项为同一项,可以通过Ctrl+Click取消选择 |
MultiSelection | 2 | 选中一项时,该项的选择状态将被改变,不影响其他项。可通过拖动鼠标选择多项 |
ExtendedSelection | 3 | 正常选择时,一次选择一项。Ctrl+Click可以改变选中项的选择状态而不影响其他项的选择状态,Shift+Click可以根据选中项的状态决定选中项和当前项间所有项的状态。可以通过拖动鼠标选择多项 |
ContiguousSelection | 4 | 正常选择时,一次选中一项。当结合Shift+Click选中某项时,选中项和当前项(即上一次的选中项)间的所有项将同时被选中或取消,这取决于选中项的状态 |
原文链接:https://blog.csdn.net/fjunchao/article/details/117551577
#include "mainwindow.h"#include <QApplication>
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>
#include <QSplitter>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QDirModel model;//新建三种不同的view对象,以便文件目录可以以三种不同的方式显示QTreeView tree;QListView list;QTableView table;tree.setModel(&model);list.setModel(&model);table.setModel(&model);tree.setSelectionMode(QAbstractItemView::MultiSelection);tree.setSelectionModel(tree.selectionModel());tree.setSelectionModel(tree.selectionModel());QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,SLOT(setRootIndex(QModelINdex)));QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,SLOT(setRootIndex(QModelINdex)));QSplitter *splitter=new QSplitter;splitter->addWidget(&tree);splitter->addWidget(&list);splitter->addWidget(&table);splitter->setWindowTitle(QObject::tr("Model/View"));splitter->show();MainWindow w;//w.show();return a.exec();
}
结果: