QT实现文件系统浏览器

  1. 使用到:QZZSplitterQHBoxLayoutQTreeWidgetQTableWidget 四个控件
  2. 如下图所示:
  3. QT5.12 使用中文出现乱码,并编译提示错误:error: C2001: 常量中有换行符

    在头文件上添加#pragma execution_character_set("utf-8")

  4. main.cpp 文件内容

  5. #include "mainwindow.h"
     
    #include <QApplication>
    #include <QTextCodec>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");    //获取系统编码
        QTextCodec::setCodecForLocale(codec);
        MainWindow w;
        w.show();
        return a.exec();
    }
    DataStructs.h 文件内容:
  6. #ifndef DATASTRUCTS_H
    #define DATASTRUCTS_H
    #include <QString>
    #include<QObjectUserData>
    typedef struct s_DicTreeData
    {
        bool isClicked;
        bool isRoot;
        QString strPath;
        s_DicTreeData()
        {
            isClicked = false;
            strPath = "";
            isRoot = false;
        }
    }DicTreeData;
     
    typedef struct s_DicFileData
    {
        QString strName;
        QString strTime;
        QString strLastModify;
    }DicFileData;
     
    Q_DECLARE_METATYPE(DicTreeData)
     
    #endif // DATASTRUCTS_H
    mainwindow.h文件内容:
  7. #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #pragma execution_character_set("utf-8")
     
    #include <QMainWindow>
    #include <QSplitter>
    #include <QHBoxLayout>
    #include <QTreeWidget>
    #include <QTableWidget>
    #include <QLabel>
    #include <QDir>
    #include <QVariant>
    #include <QDebug>
    #include <QFileIconProvider>
    #include <QDateTime>
    #include <QHeaderView>
    #include <DataStructs.h>
    #include "qzzsplitter.h"
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    public slots:
        void DirTreeClicked(QTreeWidgetItem *item, int column);
        void DirTreeDBClicked(QTreeWidgetItem *item, int column);
        void DicTableClicked(QTableWidgetItem *item);
    private:
        void InitDicTree();  //初始化目录树
        void InitDicTable();  //初始化右边发文件表格
        void SignalSlotInit(); //信号和槽初始化函数
        void AddDicTreeChild(QTreeWidgetItem *item, int column);  //在目录树添加子节点
        void AddFileList(DicFileData dfd);   //添加文件到列表
        void BrowFileOfDIC(QTreeWidgetItem *item, int column); //遍历目录下的文件
        void RemoveAllRow();  //删除表中所有记录
     
    private:
        Ui::MainWindow *ui;
    private:
        QZZSplitter *m_pMainSplitter;
        QZZSplitter *m_pRightSplitter;
        QHBoxLayout *m_pMainLayout;
     
        QTreeWidget *m_pDicTree;
        QTableWidget *m_pDicTable;
        QLabel *m_pFileInfo;
        QString m_strPrePath;  //上一次遍历的目录路径
     
        QDir m_qLogicDir;
    };
    #endif // MAINWINDOW_H
    mainwindow.cpp文件内容:
    
  8. #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setWindowTitle(tr("FileSystemBrowers"));
        m_pMainSplitter = new QZZSplitter(Qt::Horizontal);
        m_pDicTree = new QTreeWidget(m_pMainSplitter);
        m_pRightSplitter = new QZZSplitter(Qt::Vertical, m_pMainSplitter);
        m_pDicTable = new QTableWidget(m_pRightSplitter);
        m_pFileInfo = new QLabel(m_pRightSplitter);
        m_pFileInfo->setText("我是文件信息窗口");
        m_pMainSplitter->setStretchFactor(1, 1);
        m_pMainLayout = new QHBoxLayout();
        m_pMainLayout->addWidget(m_pMainSplitter);
     
        InitDicTree();
        InitDicTable();
        SignalSlotInit();
     
     
        this->centralWidget()->setLayout(m_pMainLayout);  //在MainWindow 窗口中需要调用这样调用来设置
    }
     
    void MainWindow::SignalSlotInit()
    {
        connect(m_pDicTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int )), this, SLOT(DirTreeDBClicked(QTreeWidgetItem *, int )));
        connect(m_pDicTree, SIGNAL(itemClicked(QTreeWidgetItem *, int )), this, SLOT(DirTreeClicked(QTreeWidgetItem *, int )));
        connect(m_pDicTable, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(DicTableClicked(QTableWidgetItem *)));
    }
     
    void MainWindow::DirTreeClicked(QTreeWidgetItem *item, int column)
    {
        QVariant var= item->data(column, Qt::UserRole);
        DicTreeData dtd = var.value<DicTreeData>();
        if(!dtd.isClicked)
        {
            dtd.isClicked = true;
            var=QVariant::fromValue(dtd);
            item->setData(0, Qt::UserRole, var);
            //qDebug()<<dtd.strPath<<endl;
            AddDicTreeChild(item, column); //遍历目录
        }
        if(!dtd.isRoot)
        {
            BrowFileOfDIC(item, column); //遍历文件
        }
     
        if(!item->isExpanded())
        {
            item->setExpanded(true);
        }
        else
        {
            item->setExpanded(false);
        }
    }
     
    void MainWindow::DirTreeDBClicked(QTreeWidgetItem *item, int column)
    {
     
    }
     
    void MainWindow::DicTableClicked(QTableWidgetItem *item)
    {
        QList<QTableWidgetItem*> items = m_pDicTable->selectedItems();
        QString strName = items.at(0)->text();
        strName = m_strPrePath + strName;
        m_pFileInfo->setText(strName);
        //qDebug()<<m_strPrePath<<strName;
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::InitDicTree()
    {
        m_pDicTree->clear();
        m_pDicTree->setHeaderHidden(true);
        QFileIconProvider fileIconProvider;
        DicTreeData dtd;
        QVariant vdtd;
        dtd.isClicked = true;
        dtd.isRoot = true;
        vdtd=QVariant::fromValue(dtd);
     
        QTreeWidgetItem *pRootItem = new QTreeWidgetItem(m_pDicTree);
        QString strValue= tr("计算机");
        pRootItem->setText(0, strValue);
        pRootItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
        pRootItem->setIcon(0,fileIconProvider.icon(QFileIconProvider::Computer));
        pRootItem->setData(0, Qt::UserRole, vdtd);
        pRootItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
        QTreeWidgetItem *pItem = NULL;
     
        dtd.isClicked = false;
        dtd.isRoot = false;
        foreach(QFileInfo fileInfo, m_qLogicDir.drives())
        {
            pItem =new QTreeWidgetItem(pRootItem);
            dtd.strPath = fileInfo.absoluteFilePath();
            vdtd=QVariant::fromValue(dtd);
            pItem->setText(0, dtd.strPath.replace(2,1,'\\'));
            pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
            pItem->setData(0, Qt::UserRole, vdtd);
            pItem->setIcon(0, fileIconProvider.icon(QFileIconProvider::Drive));
            pItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);  //显示左边三角形
        }
    }
     
    void MainWindow::InitDicTable()
    {
        m_strPrePath = "";
        QTableWidgetItem *pItem = NULL;
        QStringList headerList;
        headerList<<"文件名"<<"创建时间"<<"最后修改时间";
        m_pDicTable->setColumnCount(headerList.count());
        for (int i = 0; i < m_pDicTable->columnCount() ; i++)
        {
            pItem = new QTableWidgetItem(headerList.at(i));
            m_pDicTable->setHorizontalHeaderItem(i, pItem);
        }
        //设置列宽自适应
        m_pDicTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
        m_pDicTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
     
        m_pDicTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
        m_pDicTable->setSelectionBehavior(QAbstractItemView::SelectRows);
        m_pDicTable->setAlternatingRowColors(true);
        m_pDicTable->setRowCount(0);
    }
     
    void MainWindow::AddDicTreeChild(QTreeWidgetItem *item, int column)
    {
        QTreeWidgetItem *PRoot = item;
        QFileIconProvider fileIconProvider;
        QTreeWidgetItem *pItem = NULL;
        DicTreeData dtdSubDic;
        QVariant vdtd;
        QVariant var= item->data(column, Qt::UserRole);
        DicTreeData dtd = var.value<DicTreeData>();
        QString strPath = dtd.strPath;
        if(dtd.strPath.right(1) != '/')
        {
            strPath = strPath +'/';
        }
        QDir tmpDir(strPath);
        DicFileData dfd;
        foreach(QFileInfo fileInfo, tmpDir.entryInfoList())
        {
            if(fileInfo.isDir() && fileInfo.fileName().compare(".") && fileInfo.fileName().compare("..")) //目录添加到目录树上
            {
                pItem =new QTreeWidgetItem(PRoot);
                dtdSubDic.strPath = fileInfo.absoluteFilePath();
                vdtd=QVariant::fromValue(dtdSubDic);
                pItem->setText(0, fileInfo.fileName());
                pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
                pItem->setData(0, Qt::UserRole, vdtd);
                pItem->setIcon(0, fileIconProvider.icon(QFileIconProvider::Folder));
                pItem->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);//显示左边三角形
                //qDebug()<<fileInfo.fileName()<<endl;
            }        
        }
    }
     
     void MainWindow::BrowFileOfDIC(QTreeWidgetItem *item, int column)
     {
         DicTreeData dtdSubDic;
         QVariant vdtd;
         QVariant var= item->data(column, Qt::UserRole);
         DicTreeData dtd = var.value<DicTreeData>();
         QString strPath = dtd.strPath;
         if(dtd.strPath.right(1) != '/')
         {
             strPath = strPath +'/';
         }
         if(m_strPrePath.compare(strPath))
         {
             m_strPrePath = strPath;
             QDir tmpDir(strPath);
             DicFileData dfd;
             RemoveAllRow();
             foreach(QFileInfo fileInfo, tmpDir.entryInfoList())
             {
                 if(fileInfo.isFile())//文件添加到右边列表中
                 {
                     //文件添加到右边list控件中
                     dfd.strName = fileInfo.fileName();
                     dfd.strTime = fileInfo.birthTime().toString("yyyy-MM-dd hh:mm:ss");
                     dfd.strLastModify = fileInfo.lastModified().toString("yyyy-MM-dd hh:mm:ss");
                     AddFileList(dfd);
                 }
             }
         }
     }
     
    void MainWindow::AddFileList(DicFileData dfd)
    {
        //m_pDicTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
        int iCurRow = m_pDicTable->rowCount();
        m_pDicTable->insertRow(iCurRow);
        m_pDicTable->setItem(iCurRow, 0, new QTableWidgetItem(dfd.strName));
        m_pDicTable->setItem(iCurRow, 1, new QTableWidgetItem(dfd.strTime));
        m_pDicTable->setItem(iCurRow, 2, new QTableWidgetItem(dfd.strLastModify));
    }
     
    void MainWindow::RemoveAllRow()
    {
        int iRowCount = m_pDicTable->rowCount();
        for (int i = 0; i <= iRowCount ;i++)
        {
            m_pDicTable->removeRow(i);
        }
        m_pDicTable->setRowCount(0);
    }
  9. qzzsplitter.h文件内容:
  10. #ifndef QZZSPLITTER_H
    #define QZZSPLITTER_H
     
    #include <QSplitter>
    class QZZSplitter : public QSplitter
    {
        Q_OBJECT
    public:
        QZZSplitter(QWidget *parent = nullptr);
        QZZSplitter(Qt::Orientation orientation, QWidget *parent = nullptr);
    };
     
    #endif // QZZSPLITTER_H
  11. qzzsplitter.cpp 文件内容:
    
  12. #include "qzzsplitter.h"
     
    QZZSplitter::QZZSplitter(QWidget *parent)
        : QSplitter(parent)
    {
    }
    QZZSplitter::QZZSplitter(Qt::Orientation orientation, QWidget *parent)
        :QSplitter(orientation, parent)
    {
     
    }
     

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值