zoukankan      html  css  js  c++  java
  • Qt实现文件管理器

    Windows的资源管理器,大家很熟悉吧,可以放回上一级,查找到下一级………Qt中QDir 类可以实现显示文件系统目录的效果。

    笔者的机器环境:Windows8.1

    //fileview_widget.h
    
    
    #ifndef FILEVIEWWIDGET_H  
    #define FILEVIEWWIDGET_H  
      
    #include <QWidget>  
    #include <QDir>  
    #include <QListWidgetItem>  
    #include <QFileInfoList>  
    #include <QListWidget>  
    #include <QLineEdit>  
    #include <QVBoxLayout>  
    #include <QIcon>  
    #include <QStringList>  
      
    class FileViewWidget : public QWidget  
    {  
        Q_OBJECT  
    public:  
        FileViewWidget(QWidget *parent=0);  
      
        //—用双击浏览器中显示的目录进入下一级,或者返回上一级目录。  
        void showFileInfoList(QFileInfoList list);  
      
        public slots:  
            //–显示当前目录下的所有文件  
            void slotShow(QDir dir);  
      
            //—-根据选择显示下一级目录下的文件,  
            void slotDirShow(QListWidgetItem *Item);  
      
    private:  
        QLineEdit *fileLineEdit;  
        QListWidget *fileListWidget;  
        QVBoxLayout *vLayout;  
        QFileInfoList list;  
    };  
      
    #endif  //FILEVIEWWIDGET_H  
    //fileview_widget.cpp
    
    #include “fileview_widget.h”  
    #include<QTextCodec>  
      
    FileViewWidget::FileViewWidget(QWidget *parent/*=0*/) :QWidget(parent)  
    {  
        //—–实例化对象  
        fileLineEdit = new QLineEdit(“/”, this);  
        fileListWidget = new QListWidget(this);  
      
        //—布局  
        vLayout = new QVBoxLayout(this);  
        vLayout->addWidget(fileLineEdit);  
        vLayout->addWidget(fileListWidget);  
      
        //–设置对应信号与槽  
        connect(fileLineEdit, SIGNAL(returnPressed()),   
                    this, SLOT(slotDirShow(QDir)));  
        connect(fileListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)),  
                    this, SLOT(slotDirShow(QListWidgetItem*)));  
        QString rootStr = ”/”;  
        QDir rootDir(rootStr);  
        QStringList stringlist;  
        stringlist << ”*”;  
        list = rootDir.entryInfoList(stringlist);  
        showFileInfoList(list);  
      
        //—显示布局  
        setLayout(vLayout);  
        //—-设置窗口属性  
        setWindowTitle(”File View”);  
    }  
      
    //–显示当前目录下的所有文件  
    void FileViewWidget::slotShow(QDir dir)  
    {  
         QStringList stringList;  
         stringList << ”*”;  
         QFileInfoList InfoList = dir.entryInfoList(stringList, QDir :: AllEntries, QDir :: DirsFirst);  
         showFileInfoList(InfoList);  
    }  
      
    //—用双击浏览器中显示的目录进入下一级,或者返回上一级目录。  
    void FileViewWidget::showFileInfoList(QFileInfoList list)  
    {  
        //–清空列表控件  
        fileListWidget->clear();  
      
        //—-取出所有项,按照目录,文件方式添加到控件内  
        for (unsigned int i = 0; i < list.count(); i++)  
        {  
            QFileInfo tmpFileInfo = list.at(i);  
            if (tmpFileInfo.isDir())  
            {  
                QIcon icon(”dir.png”);  
                QString fileName = tmpFileInfo.fileName();  
                QListWidgetItem*tmpListWidgetItem = new QListWidgetItem(icon, fileName);  
                fileListWidget->addItem(tmpListWidgetItem);  
            }  
            else  
            {  
                QIcon icon(”file.png”);  
                QString fileName = tmpFileInfo.fileName();  
                QListWidgetItem*tmpListWidgetItem = new QListWidgetItem(icon, fileName);  
                fileListWidget->addItem(tmpListWidgetItem);  
            }  
        }  
    }  
      
    //—-根据用户的选择显示下一级目录下的文件,  
    void FileViewWidget::slotDirShow(QListWidgetItem *Item)  
    {  
        //—-保存下一级目录名  
        QString string = Item->text();  
        QDir dir;  
        //—-设置路径为当前目录路径  
        dir.setPath(fileLineEdit->text());  
        //—–重新设置路径  
        dir.cd(string);  
        //—-更新当前显示路径, 这里获取的是绝对路径  
        fileLineEdit->setText(dir.absolutePath());  
        //—显示当前文件目录下的所有文件  
        slotShow(dir);  
    }  
    //main.cpp
    
    #pragma once  
    #include <QtWidgets/QApplication>  
    #include “fileview_widget.h”  
      
    int main(int argc, char *argv[])  
    {  
        QApplication a(argc, argv);  
      
        FileViewWidget win;  
        win.show();  
      
        return a.exec();  
    }  

     下面是运行结果

                                                         

    这里笔者列出关于QDir::Filter 的过滤方式,信息来源:assistant

    Constant	Value	Description
    QDir::Dirs	0x001	List directories that match the filters.
    QDir::AllDirs	0x400	List all directories; i.e. don't apply the filters to directory names.
    QDir::Files	0x002	List files.
    QDir::Drives	0x004	List disk drives (ignored under Unix).
    QDir::NoSymLinks	0x008	Do not list symbolic links (ignored by operating systems that don't support symbolic links).
    QDir::NoDotAndDotDot	NoDot | NoDotDot	Do not list the special entries "." and "..".
    QDir::NoDot	0x2000	Do not list the special entry ".".
    QDir::NoDotDot	0x4000	Do not list the special entry "..".
    QDir::AllEntries	Dirs | Files | Drives	List directories, files, drives and symlinks (this does not list broken symlinks unless you specify System).
    QDir::Readable	0x010	List files for which the application has read access. The Readable value needs to be combined with Dirs or Files.
    QDir::Writable	0x020	List files for which the application has write access. The Writable value needs to be combined with Dirs or Files.
    QDir::Executable	0x040	List files for which the application has execute access. The Executable value needs to be combined with Dirs or Files.
    QDir::Modified	0x080	Only list files that have been modified (ignored on Unix).
    QDir::Hidden	0x100	List hidden files (on Unix, files starting with a ".").
    QDir::System	0x200	List system files (on Unix, FIFOs, sockets and device files are included; on Windows, .lnk files are included)
    QDir::CaseSensitive	0x800	The filter should be case sensitive.
    
  • 相关阅读:
    【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
    【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
    【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
    【nodejs原理&源码赏析(5)】net模块与通讯的实现
    【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
    工作一年多的感慨与总结(二)
    工作一年多的感慨与总结(一)
    动手实践Mybatis插件
    MySQL存储引擎
    Tomcat类加载架构
  • 原文地址:https://www.cnblogs.com/ITGUANCHAZHE/p/14319756.html
Copyright © 2011-2022 走看看