您的位置:首页 > 编程语言 > Qt开发

Qt 创建文件浏览器

2016-04-11 19:01 225 查看
  

   摘要:

              使用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创建文件浏览器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: