Qt文件浏览工具重新实现

Qt文件浏览工具重新实现

说明

包含树形数据结构,文件图标获取,运行程序功能,表格代理

效果图

请添加图片描述
在这里插入图片描述

部分源代码

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSplitter>
#include <QTableView>
#include <QTextBrowser>
#include <QPushButton>
#include <QComboBox>
#include <QGroupBox>
#include <QToolBar>
#include <QTextBrowser>
#include <QLabel>
#include "mytreeview.h"
#include "TreeModel.h"
#include "custommodel.h"
#include "customtabview.h"
#include <QFile>
#include <QFileInfo>
#include <QDir>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //表格视图部分初始化
    void fun_ViewInit();
    //节点初始化
    void fun_DataInit();

    void fun_getRootFileList(TreeItem *ParentItem);
    void fun_getChildFileList(TreeItem *ParentItem,QString Path);
    void fun_Creator_ChildNode(TreeItem *parent,const _DATA_STRUCT &data);
    QIcon getFileIcon(QFileInfo &fileInfor);
signals:

public slots:
    //树形列表双击
    void slots_TreeviewDoubleClicked();
    //点击张开时执行改槽函数
    void slots_expanded(const QModelIndex &index);
    //表格点击按钮
    void slots_btnClicked(const QModelIndex index);
public:
    QSplitter *m_spl_Horizontal;
    QSplitter *m_spl_Vertical;

    CustomTabView *m_tabView;
    MyTreeView *m_treeView;

    TreeModel *m_treeModel;
    CustomModel *m_tabModel;

protected:
    void changeEvent(QEvent *event);

public:

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QHeaderView>
#include <QStyleFactory>
#include <QDebug>
#include <QSettings>
#include <QMessageBox>
#include <QFrame>
#include <QDateTime>
#include "customitemdelegate.h"
#include "customtabview.h"
#include <QFileIconProvider>
#include <QTemporaryFile>
#include <QProcess>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowTitle(QString("文件浏览工具 --老人与海 %1").arg(STR_VERSION));

    m_spl_Horizontal=new  QSplitter(Qt::Horizontal);
    m_spl_Vertical=new QSplitter(Qt::Vertical);

    QFrame *m_line = new QFrame(this);
    m_line->setFrameShape(QFrame::HLine);

    QVBoxLayout *V_layout=new QVBoxLayout();
    V_layout->addWidget(m_line);
    V_layout->addWidget(m_spl_Horizontal);
    ui->centralwidget->setLayout(V_layout);

    this->fun_ViewInit();
    this->fun_DataInit();
}

MainWindow::~MainWindow()
{
    qDebug()<<"~MainWindow()";
    delete ui;
}

void MainWindow::fun_ViewInit()
{
    m_treeView=new MyTreeView();
   // m_treeView->setMaximumWidth(220);
    m_treeView->setMinimumWidth(230);
    m_treeView->setSelectionMode(QTreeView::SingleSelection);        //单选,配合上面的整行就是一次选单行
    m_treeView->header()->setStretchLastSection(true);//单选,配合上面的整行就是一次选单行//单选,配合上面的整行就是一次选单行
    m_treeView->setSelectionBehavior(QTreeView::SelectRows);			//一次选中整行
    m_treeView->setFocusPolicy(Qt::NoFocus);                  //去掉鼠标移到单元格上时的虚线框
    m_treeView->setLineWidth(1);
    m_treeView->setStyle(QStyleFactory::create("windows"));
    connect(m_treeView,&MyTreeView::sig_clickedDoubel,this,&MainWindow::slots_TreeviewDoubleClicked);
    connect(m_treeView,&MyTreeView::expanded,this,&MainWindow::slots_expanded);

    QStringList HeaderList;
    HeaderList<<tr("分类");
    m_treeModel=new TreeModel(HeaderList,this);
    m_treeView->header()->hide();
    m_treeView->setModel(m_treeModel);

    m_tabView=new CustomTabView();
    m_tabView->verticalHeader()->hide();
    m_tabView->horizontalHeader()->setStretchLastSection(true); //行头自适应表格
    m_tabView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//自动适应表项宽度
    m_tabModel=new CustomModel(this);
    customItemDelegate* Delegate = new customItemDelegate(m_tabView,m_tabModel);
    connect(Delegate,&customItemDelegate::sig_btnClicked,this,&MainWindow::slots_btnClicked);
    m_tabView->setItemDelegate(Delegate);
    m_tabView->setModel(m_tabModel);

    m_spl_Horizontal->addWidget(m_treeView);
    m_spl_Horizontal->addWidget(m_spl_Vertical);
    m_spl_Horizontal->setStretchFactor(0,2);
    m_spl_Horizontal->setStretchFactor(1,8);
    m_spl_Vertical->addWidget(m_tabView);
    m_spl_Vertical->setStretchFactor(0,8);
    m_spl_Vertical->setStretchFactor(1,2);
}

void MainWindow::fun_DataInit()
{
    TreeItem* root = m_treeModel->root();
    fun_getRootFileList(root);
}


void MainWindow::fun_getRootFileList(TreeItem *ParentItem)
{
    if(ParentItem==nullptr){
        return ;
    }
    foreach (QFileInfo my_info, QDir::drives())
    {
        _DATA_STRUCT fileInfor;
        fileInfor.strFileName=my_info.absoluteFilePath();
        fileInfor.strPath=my_info.absoluteFilePath();
        fileInfor.intFileSize=my_info.size();
        fileInfor._Icon=getFileIcon(my_info);

        fun_Creator_ChildNode(ParentItem,fileInfor);
       // qDebug()<<fileInfor.strFileName<<fileInfor.strPath<<fileInfor.intFileSize;
    }

    for(int i=0;i<ParentItem->childCount();i++){
        TreeItem *Item_Child=ParentItem->child(i);
        if(Item_Child->m_IsLoad==false){
            Item_Child->m_IsLoad=true;
            fun_getChildFileList(Item_Child,Item_Child->getData()->strPath);
        }
    }

    return ;
}

void MainWindow::fun_getChildFileList(TreeItem *ParentItem, QString Path)
{
    if(ParentItem==nullptr){
        return ;
    }
    //qDebug()<<"Path"<<Path;
    QStringList filePathList;
    QDir dirPath(Path);
    QStringList format;
        format<<"*";

    QList<QFileInfo> file(dirPath.entryInfoList(format,QDir::AllDirs|QDir::Files,QDir::NoSort));
    for(int i=0;i<file.count();i++)
    {
        //过来当前目录和上一级目录
        if(file[i].fileName().indexOf(".")==0){
            continue;
        }
        if(file[i].fileName().indexOf("..")==0){
            continue;
        }
        _DATA_STRUCT fileInfor;
        fileInfor.strFileName=file[i].fileName();
        fileInfor.strPath=file[i].absoluteFilePath();
        fileInfor.intFileSize=file[i].size();

        fileInfor._Icon=getFileIcon(file[i]);
        fun_Creator_ChildNode(ParentItem,fileInfor);
        //qDebug()<<fileInfor.strFileName<<fileInfor.strPath<<fileInfor.intFileSize;
    }
    return ;
}

void MainWindow::fun_Creator_ChildNode(TreeItem *parent, const _DATA_STRUCT &data)
{
    //qDebug()<<"fun_Creator_ChildNode";
    _DATA_STRUCT *Child_data=new _DATA_STRUCT;
    *Child_data=data;

    TreeItem* Child_Node = new TreeItem(parent); //指定父节点
    Child_Node->setPtr(Child_data);
    parent->appendChild(Child_Node); //添加子节点
}

QIcon MainWindow::getFileIcon(QFileInfo &fileInfor)
{
    QIcon RetIcon;
    QFileIconProvider icon;
    return icon.icon(fileInfor);

}
void MainWindow::slots_TreeviewDoubleClicked()
{
//    QModelIndex index=m_treeView->currentIndex();
//    this->slots_expanded(index);
}

void MainWindow::slots_expanded(const QModelIndex &index)
{
    if(index.isValid()==false){ return; }

    //获取张开节点的子节点的下一节点
    TreeItem *Item=m_treeModel->itemFromIndex(index);
    for(int i=0;i<Item->childCount();i++)
    {
        TreeItem *Item_Child=Item->child(i);
        if(Item_Child->m_IsLoad==false)
        {
            Item_Child->m_IsLoad=true;
            fun_getChildFileList(Item_Child,Item_Child->getData()->strPath);
        }
    }
    emit m_treeModel->layoutChanged();

    QModelIndex indexTab=m_tabView->currentIndex();
    m_tabView->closePersistentEditor(indexTab);//关闭打开的编辑控件,不然不同的数据不同的代理控件会倒置段错误
    m_tabModel->fun_clearData();
    m_tabModel->fun_HederInit();
    for(int row=0;row<Item->childCount();row++){
        _DATA_STRUCT *Data=Item->child(row)->getData();
        m_tabModel->fun_addDataRow(*Data);
    }

    emit m_tabModel->layoutChanged();
    m_tabView->resizeColumnToContents(2);//根据内容自动适应宽度
}

void MainWindow::slots_btnClicked(const QModelIndex index)
{

    _DATA_STRUCT  data=m_tabModel->fun_GetDataItem(index);

//    QProcess::startDetached(QString("start %1").arg(data.strPath));

//    QProcess m_Process;
//    QString StrCmd=QString("start %1").arg(data.strPath);
//    m_Process.start(StrCmd);
//    QString StrError;
//    QString StrResults;
//    if(!m_Process.waitForFinished(5000))
//    {
//        StrError=m_Process.readAllStandardError();
//        qDebug()<<"CMD_RunTmpShell->"<<StrError;

//    }
//    StrResults=m_Process.readAllStandardOutput();
//    m_Process.close();

//    qDebug()<<"slots_btnClicked"<<data.strPath<<StrCmd<<StrResults<<endl;

    QString StrCmd=QString("start %1").arg(data.strPath);
    system(StrCmd.toLocal8Bit());
   // qDebug()<<"slots_btnClicked"<<data.strPath<<endl;
}

void MainWindow::changeEvent(QEvent *event)
{
    if(event->type()==QEvent::LanguageChange)
    {
        //this->slots_SetSubText();
    }
    else
    {
         QWidget::changeEvent(event);
    }
}

代码下载

源码下载
链接: 源码下载

体验服:
链接: 体验服

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值