QT6
QFileSystemModel和QTreeView
- QFileSystemModel为本机的文件系统提供一个模型,QFileSystemModelt和QTreeView结合使用,可以用目录树的形式显示本机的文件系统,如同Windows的资源管理器一样
- 使用QFileSystemModel提供的接口函数,我们可以创建目录、删除目录、重命名目录、可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详情情况
QTreeView常用属性和方法
模型相关
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| model() | QAbstractItemModel* | 获取视图使用的数据模型 |
| setModel() | void | 设置视图的数据模型 |
| selectionModel() | QItemSelectionModel* | 获取选择模型 |
| setSelectionModel() | void | 设置选择模型 |
外观与布局
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| indentation() | int | 获取缩进宽度 |
| setIndentation() | void | 设置缩进宽度 |
| uniformRowHeights() | bool | 获取是否使用统一行高 |
| setUniformRowHeights() | void | 设置是否使用统一行高 |
| columnWidth() | int | 获取指定列的宽度 |
| setColumnWidth() | void | 设置指定列的宽度 |
| header() | QHeaderView* | 获取表头视图 |
| setHeader() | void | 设置表头视图 |
| wordWrap() | bool | 获取是否自动换行 |
| setWordWrap() | void | 设置是否自动换行 |
展开/折叠操作
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| expandsOnDoubleClick() | bool | 获取是否双击展开项 |
| setExpandsOnDoubleClick() | bool | 设置是否双击展开项 |
| itemsExpandable() | bool | 获取项是否可展开 |
| setItemsExpandable() | void | 设置项是否可展开 |
| rootIsDecorated() | bool | 获取根项是否显示装饰 |
| setRootIsDecorated() | void | 设置根项是否显示装饰 |
| expand() | void | 展开指定索引的项 |
| collapse() | void | 折叠指定索引的项 |
| expandAll() | void | 展开所有项 |
| collapseAll() | void | 折叠所有项 |
| expandRecursively() | void | 递归展开项 |
| isExpanded() | bool | 检查指定索引的项是否展开 |
选择操作
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| setSelectionMode() | void | 设置选择模式 |
| selectionMode() | QAbstractItemView::SelectionMode | 获取选择模式 |
| setSelectionBehavior() | void | 设置选择行为 |
| selectionBehavior() | QAbstractItemView::SelectionBehavior | 获取选择行为 |
| currentIndex() | QModelIndex | 获取当前选中项的索引 |
| setCurrentIndex() | void | 设置当前选中项 |
| selectedIndexes() | QModelIndexList | 获取所有选中项的索引列表 |
| clearSelection() | void | 清除所有选择 |
| selectAll() | void | 选择所有项 |
编辑功能
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| edit() | void | 编辑指定索引的项 |
| setEditTriggers() | void | 设置编辑触发器 |
| editTriggers() | EditTriggers | 获取编辑触发器 |
排序功能
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| sortByColumn() | void | 按指定列排序 |
| setSortingEnabled() | void | 启用或禁用排序 |
| isSortingEnabled() | bool | 检查是否启用排序 |
视图操作
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| indexAt() | QModelIndex | 获取指定位置的模型索引 |
| visualRect() | QRect | 获取指定索引的可视矩形区域 |
| scrollTo() | void | 滚动到指定索引 |
| resizeColumnToContents() | void | 调整列宽以适应内容 |
动画效果
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| animated() | bool | 获取是否启用动画效果 |
| setAnimated() | void | 设置是否启用动画效果 |
焦点显示
| 属性/方法 | 类型 | 描述 |
|---|---|---|
| allColumnsShowFocus() | bool | 获取所有列是否显示焦点 |
| setAllColumnsShowFocus() | void | 设置所有列是否显示焦点 |
代码测试
cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QFileSystemModel>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建model对象
m_model = new QFileSystemModel(this);
// 设置model对象
ui->tableView->setModel(m_model);
ui->tableView->setShowGrid(false);
ui->treeView ->setModel(m_model);
ui->listView->setModel(m_model);
// 初始化
m_model->setRootPath(QDir::currentPath());
// 设置初始化目录
ui->treeView->setRootIndex(m_model->index(QDir::currentPath()));
connect(ui->treeView,&QTreeView::clicked,ui->listView,&QListView::setRootIndex);
connect(ui->treeView,&QTreeView::clicked,ui->tableView,&QTableView::setRootIndex);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionSetRoot_triggered()
{
// 设置根目录
QString dirStr = QFileDialog::getExistingDirectory(this,"选择目录",QDir::currentPath());
if(dirStr.isEmpty()) return;
ui->treeView->setRootIndex(m_model->index(dirStr));
ui->listView->setRootIndex(m_model->index(dirStr));
ui->tableView->setRootIndex(m_model->index(dirStr));
}
void MainWindow::on_radioButtonShowRootAndFile_clicked()
{
m_model->setFilter(QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot);
ui->groupBox_4->setEnabled(true);
}
void MainWindow::on_radioButtonOnlyFile_clicked()
{
m_model->setFilter(QDir::AllDirs|QDir::NoDotAndDotDot);
ui->groupBox_4->setEnabled(false);
}
void MainWindow::on_checkBoxFileFilter_clicked(bool checked)
{
ui->comboBox->setEnabled(checked);
ui->pushButton->setEnabled(checked);
m_model->setNameFilterDisables(!checked);
}
void MainWindow::on_pushButton_clicked()
{
QStringList filter = ui->comboBox->currentText().trimmed().split(",",Qt::SkipEmptyParts);
m_model->setNameFilters(filter);
}
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
ui->labelFileName->setText(QString("文件名称:%1").arg(m_model->fileName(index)));
ui->labelFileSize->setText(QString("文件大小:%1 %2").arg(m_model->size(index)/1024).arg("KB"));
ui->labelPathName->setText(QString("文件路径:%1").arg(m_model->filePath(index)));
ui->labelNoedType->setText(QString("节点类型:%1").arg(m_model->type(index)));
ui->checkBoxIsCatalog->setChecked(m_model->isDir(index));
}
效果展示

