【QT】QFileSystemModel类的应用介绍
2023-12-20 16:48:41
目录
?1?QFileSystemModel类介绍
1.1 属性
-
nameFilterDisables : bool 此属性保存未通过名称筛选器的文件是隐藏还是禁用,默认值为true
-
options : options 此属性包含影响模型的各种选项,默认情况下,所有选项均为disabled
-
readOnly : bool 此属性保存目录模型是否允许写入文件系统,默认情况下为true
-
resolveSymlinks : bool 此属性保存目录模型是否应解析符号链接,默认情况下为true
?? ??? ?信号
1.2 信号
1.3 函数
2 QFileSystemModel类的基本功能
?? ??? ?QFileSystemModel提供了一个可用于访问本机文件系统的数据模型。QFileSystemModel和视
图组件QTreeView结合使用,可以用目录树的形式显示本机上的文件系统,如同Widnows的资源
管理器一样。使用QFileSystemModeI提供的接口函数,可以创建目录、删除目录、重命名目录,
可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。
?? ??? ?要通过QFileSystemModel获得本机的文件系统,需要用setRootPath()函QFileSystemModel
设置一个根目录,例如:
QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::currentPath());//静态函数QDir::currentPath()获取应用程序的当前路径。
?? ??? ?用于获取磁盘文件目录的数据模型类还有一个QDirModel,QDirModel的功能与QFileSystemModel
类似,也可以获取目录和文件,但是QFileSystemModel采用单独的线程获取目录文件结构,而QDirModel
不使用单独的线程。使用单独的线程就不会阻碍主线程,所以推荐使用QFileSystemModel。
?? ??? ?使用QFileSystemModel作为数据模型,QTreeView、QListView和QTableView为主要组件设
计的实例samp5-1运行界面如图5-6所示。在TreeView中以目录树的形式显示本机的文件系统,
单击一个目录时,右边的ListView和TableView显示该目录下的目录和文件。在TreeView上单击
一个目录或文件节点时,下方的几个标签里显示当前节点的信息。
3 QFileSystemModel的使用
实例samp5_1的主窗囗是基于QMainWindow的,在使用UI设计器做可视化设计时删除了工具栏和状态栏。主窗口界面布局采用了两个分割条的设计,ListView和TableView采用上下分割布
局,然后和左边的TreeView采用水平分割布局,水平分割布局再和下方显示信息的groupBox在
主窗口工作区水平布局。
在主窗口类中定义了一个QFileSystemModel类的成员变量model。
QFileSystemModel? *model;
主窗口构造函数进行初始化,代码如下:
MainWindow::MainWindow(QWidget *parent) :
????QMainWindow(parent),
????ui(new Ui::MainWindow)
{
????ui->setupUi(this);
? //????setCentralWidget(ui->splitterMain);??//设置主布局,填充满窗口
? //????model=new QDirModel(this);//QDirModel无单独线程
????model=new QFileSystemModel(this); //QFileSystemModel提供单独线程,推荐使用
????model->setRootPath(QDir::currentPath()); //设置根目录
????ui->treeView->setModel(model); //设置数据模型
????ui->listView->setModel(model); //设置数据模型
????ui->tableView->setModel(model); //设置数据模型
//信号与槽关联,treeView单击时,其目录设置为listView和tableView的根节点
????connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
????????????ui->listView,SLOT(setRootIndex(QModelIndex)));
????connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
????????????ui->tableView,SLOT(setRootIndex(QModelIndex)));
}
?? ??? ?3个视图组件都使用setModel()函数,将QFileSystemModeI数据模型model设置为自己的数
据模型。
?? ??? ?connect()函数设置信号与槽的关联,实现的功能是:在单击treeView的一个节点时,此节点
就设置为listView和tableView的根节点,因为treeView的clicked(QModelIndex)信号会传递一个
QModelIndex变量,是当前节点的模型索引,将此模型索引传递给和tableView的槽函数
setRootIndex(QModelIndex),listView和tableView就会显示此节点下的目录和文件。
?? ??? ?在treeView上单击一个节点时,下方的一些标签里会显示节点的一些信息,这是为treeView
的clicked(constQModelIndex &index)信号编写槽函数实现的,其代码如下:
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
????ui->chkIsDir->setChecked(model->isDir(index));
????ui->LabPath->setText(model->filePath(index));
????ui->LabType->setText(model->type(index));
????ui->LabFileName->setText(model->fileName(index));
????int sz=model->size(index)/1024;
????if (sz<1024)
????????ui->LabFileSize->setText(QString("%1 KB").arg(sz));
????else
????????ui->LabFileSize->setText(QString::asprintf("%.1f MB",sz/1024.0));
}
函数有一个传递参数QModelIndex? &index,它是单击节点在数据模型中的索引。通过传递来的模型
索引index,这段代码使用了QFileSystemModel的一些函数来获得节点的一些参数,包括以下几种。
-
bool? isDir(QModelIndex? &index):判断节点是不是一个目录。
-
QString? filePath(QModelIndex? &index):返回节点的目录名或带路径的文件名。
-
QString? fileName(QModelIndex? &index):返回去除路径的文件夹名称或文件名。
-
QString? type(QModelIndex? &index):返回描述节点类型的文字,如硬盘符是“Drive”,文
? ? ? ? 件夹是"FileFolder”,文件则用具体的后缀描述,如"txtFile""exeFile”"pdfFile"等。
-
qint64? size(QModelIndex? &index):如果节点是文件,返回文件大小的字节数:如果节点是文件夹,返回 0。
?? ??? ?而QFileSystemModel是如何获取磁盘目录文件结构的,3个视图组件是如何显示这些数据的,
则是其底层实现的问题了。
4 QFileSystemModel应用程序示例
(1)main.cpp文件
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
????QApplication a(argc, argv);
????MainWindow w;
????w.show();
????return a.exec();
}
(2)mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//#include????<QDirModel>
#include????<QFileSystemModel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
????Q_OBJECT
private:
//????QDirModel????*model;
????QFileSystemModel????*model; //定义数据模型变量
public:
????explicit MainWindow(QWidget *parent = 0);
????~MainWindow();
private slots:
//????void on_treeView_doubleClicked(const QModelIndex &index);
????void on_treeView_clicked(const QModelIndex &index);
private:
????Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
(3)
mainwindow
.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
????QMainWindow(parent),
????ui(new Ui::MainWindow)
{
????ui->setupUi(this);
//????setCentralWidget(ui->splitterMain);??//设置主布局,填充满窗口
//????model=new QDirModel(this);//QDirModel无单独线程
????model=new QFileSystemModel(this); //QFileSystemModel提供单独线程,推荐使用
????model->setRootPath(QDir::currentPath()); //设置根目录
????ui->treeView->setModel(model); //设置数据模型
????ui->listView->setModel(model); //设置数据模型
????ui->tableView->setModel(model); //设置数据模型
//信号与槽关联,treeView单击时,其目录设置为listView和tableView的根节点
????connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
????????????ui->listView,SLOT(setRootIndex(QModelIndex)));
????connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
????????????ui->tableView,SLOT(setRootIndex(QModelIndex)));
}
MainWindow::~MainWindow()
{
????delete ui;
}
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
????ui->chkIsDir->setChecked(model->isDir(index));
????ui->LabPath->setText(model->filePath(index));
????ui->LabType->setText(model->type(index));
????ui->LabFileName->setText(model->fileName(index));
????int sz=model->size(index)/1024;
????if (sz<1024)
????????ui->LabFileSize->setText(QString("%1 KB").arg(sz));
????else
????????ui->LabFileSize->setText(QString::asprintf("%.1f MB",sz/1024.0));
}
(4)
mainwindow
.ui文件
文章来源:https://blog.csdn.net/u011671745/article/details/135106492
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!