Qt 创建文件浏览器

  

   摘要:

              使用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创建文件浏览器

你可能感兴趣的:(Qt 创建文件浏览器)