摘要:
使用Qt来实现文件浏览器 主要有两种方式: 一种,使用QDir获取目录列表,使用QListWidget作为视图窗口显示目录。获取目录列表的核心函数是:
QDir::entryInfoList; 其返回值类型 QFileInFoList 文件信息列表,可以获取文件的各种信息
QFileInfoList QDir::entryInfoList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const 参数一: 文件名称过滤器 (实质是一个QStringList 字符串列表) 参数二: 属性过滤器 参数三: 设置排序类型
第二种:树目录 使用Model/view架构来处理目录数据和显示之间的关系(相关内容见【1】),其中Model模型为:QFileSystemModel View模型为QtreeView;
其关键的两个核心函数为:QTreeView::setModel(model) 和 QTreeView::setRootIndex(index);
浏览器构成: 1 一个返回上级菜单按钮 2 一个文本框显示当前地址 3一个核心widget(显示文件目录)
实现: 将相关部件封装成一个widget部件 然后将其添加到主界面的浮动窗口中
获取文件路径:使用了QtreeView的两个信号函数:void QTreeView::expanded(const QModelIndex & index) 和 void QTreeView::clicked(const QModelIndex & index)
其中传递的参数QModeIIndex (模型索引【2】) 提供类相关的文件信息索引。其包含了三个重要的属性:行号、列号以及父索引 可以帮助我们定位为相对应的文件信息。 之后我们调用QFileInfo QFileSystemModel::fileInfo(const QModelIndex & index) const 返回一个fileInfo类(这是我们最终想要的)。该类可以返回对应文件的据对文件路径。还可以返回文件名和后缀名(可以用作筛选文件)
部分代码(书目录):
#ifndef FILEBROWSER #define FILEBROWSER #include<QtGui> #include<QtWidgets> class FileBrowser : public QWidget { Q_OBJECT public: FileBrowser(QWidget *parent); void showFileInfoList(QFileInfoList list); public slots: void slotShowDir(QListWidgetItem * item); void slotShow(QDir dir); void UpButtonClicked(); public: QLineEdit *LineEditDir; QListWidget *ListWidgetFile; QPushButton *UpButton; }; #endif // FILEBROWSER
#include"treeview.h" #include<QDebug> #include<QFileInfo> fileView::fileView(QWidget *parent): QWidget(parent) { //创建变量 tree=new QTreeView(this); model=new QFileSystemModel(); LineEditDir = new QLineEdit(this); UpButton=new QPushButton(this); UpButton->setIcon(QIcon(":/Images/ImageSource/return.png")); //添加布局 QVBoxLayout *vbLayout = new QVBoxLayout(this); //垂直布局 QHBoxLayout *hbLayout = new QHBoxLayout(); //水平布局 hbLayout->addWidget(UpButton); hbLayout->addWidget(LineEditDir); vbLayout->addLayout(hbLayout); vbLayout->addWidget( tree ); model->setRootPath(""); tree->setModel(model); tree->setRootIndex(model->index("/home")); // 设置窗口样式 tree->setAnimated(true); tree->setIndentation(20); tree->setSortingEnabled(true); tree->setColumnWidth(0, tree->width()*2); const QSize availableSize = parent->size(); tree->resize(availableSize); tree->header()->setStretchLastSection(true); tree->header()->setSortIndicator(0, Qt::AscendingOrder); tree->header()->setSortIndicatorShown(true); #if QT_VERSION >= 0x050000 tree->header()->setSectionsClickable(true); #else tree->header()->setClickable(true); #endif //槽函数 connect(tree,SIGNAL(expanded(QModelIndex)),this,SLOT(slotshowDir(QModelIndex)));//展开信号 connect(tree,SIGNAL(clicked(QModelIndex)),this,SLOT(slotshowDir(QModelIndex))); //单击信号 connect(tree->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(slotshowDir(QModelIndex))); //item发生变化作为信号 } void fileView::slotshowDir(const QModelIndex &index) { QFileInfo tmpInfo=model->fileInfo(index); //获取文件信息 QString absolutepath=tmpInfo.absoluteFilePath(); //获取文件的绝对路径路径(包括文件名) if(tmpInfo.isDir()) { LineEditDir->setText(absolutepath); } else if(tmpInfo.isFile()) { QString ext=tmpInfo.suffix(); //获取文件后缀名 筛选后缀名为png和jpg 输出地址 // qDebug()<<"extension:"<<ext; if((ext=="png")|(ext=="jpg")) qDebug()<<"filepath:"<<tmpInfo.absoluteFilePath(); } }
【1】model/view架构
【2】Modellindex
【3】Qt目录树实现
【4】Qt创建文件浏览器