QT 实现文件资源浏览器

先看效果:

代码如下:

ExplorerWindow.h

cpp 复制代码
#pragma once

#include <QMainWindow>
#include <QSplitter>
#include <QTreeView>
#include <QTableView>
#include <QFileSystemModel>

class ExplorerWindow : public QMainWindow
{
public:
    ExplorerWindow(QWidget *parent = nullptr);
    ~ExplorerWindow();
    
private:
    void initUi();
    void createTreeView();
    void createTableView();
    void buildConnection();
    
private:
    QSplitter           *m_splitter {nullptr};
    QTreeView           *m_treeView {nullptr};
    QTableView          *m_tableView {nullptr};
    QFileSystemModel    *m_model {nullptr};
};

ExplorerWindow.cpp

cpp 复制代码
#include "ExplorerWindow.h"
#include <QHeaderView>
#include <QDir>

ExplorerWindow::ExplorerWindow(QWidget *parent) : QMainWindow(parent)
{
    initUi();
    buildConnection();
}

ExplorerWindow::~ExplorerWindow()
{
}

void ExplorerWindow::initUi()
{
    setWindowTitle(QStringLiteral("文件浏览器"));
    resize(1000, 600);
    
    m_splitter = new QSplitter(this);
    m_model = new QFileSystemModel(this);
    m_model->setRootPath(QString());
    
    createTreeView();
    createTableView();
    
    m_splitter->setStretchFactor(0, 1);
    m_splitter->setStretchFactor(1, 3);
    
    setCentralWidget(m_splitter);
}

void ExplorerWindow::createTreeView()
{
    m_treeView = new QTreeView(m_splitter);
    m_treeView->setModel(m_model);
    m_treeView->setRootIndex(m_model->index(QString()));
    
    m_treeView->setColumnWidth(0, 235);
    m_treeView->hideColumn(1);
    m_treeView->hideColumn(2);
    m_treeView->hideColumn(3);
    //m_treeView->header()->setStretchLastSection(true);
    m_treeView->setHeaderHidden(true);
    
    //     m_treeView->setStyleSheet(R"(
    // QTreeView {
    //     background-color: white;
    //     border: 1px solid #d0d0d0;
    //     selection-background-color: #3399ff;
    //     selection-color: white;
    // }
    // QTreeView::item {
    //     padding: 5px;
    // }
    // QTreeView::item:hover {
    //     background-color: #f0f7ff;
    // }
    // QTreeView::item:selected {
    //     background-color: #3399ff;
    //     color: white;
    // }
    // )");
}

void ExplorerWindow::createTableView()
{
    m_tableView = new QTableView(m_splitter);
    m_tableView->setModel(m_model);
    m_tableView->setRootIndex(m_model->index(QDir::homePath()));
    
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    m_tableView->setSortingEnabled(true);
    m_tableView->horizontalHeader()->setStretchLastSection(true);
    //m_tableView->verticalHeader()->setDefaultSectionSize(20);
    //m_tableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight | Qt::AlignVCenter);
    m_tableView->verticalHeader()->hide();
    
    int cnt = m_tableView->horizontalHeader()->count();
    if (cnt > 0)
        m_tableView->setColumnWidth(0, 360);
    if (cnt > 1)
        m_tableView->setColumnWidth(1, 100);
    if (cnt > 2)
        m_tableView->setColumnWidth(2, 100);
    
    m_tableView->setStyleSheet(R"(
TableView {
    background: #f8fafc;
    alternate-background-color: #eef3f8;
    border: 1px solid #cfd8e3;
    border-radius: 6px;
    gridline-color: #d9e2ec;
    color: #1f2933;
    font-size: 14px;
    selection-background-color: #4a90e2;
    selection-color: white;
    outline: 0;
}
QTableView::item {
    padding: 2px 2px;
    border: none;
}
QTableView::item:hover {
    background: #e6f2ff;
}
QTableView::item:selected {
    background: #4a90e2;
    color: white;
}
QHeaderView::section {
    background: #e9eef5;
    color: #334155;
    padding: 4px;
    border: none;
    border-right: 1px solid #d0d7e2;
    border-bottom: 1px solid #cbd5e1;
    font-weight: 600;
})");
}

void ExplorerWindow::buildConnection()
{
    connect(m_treeView, &QTreeView::clicked, this, [this](const QModelIndex &index) {
        if (m_model->isDir(index)) {
            m_tableView->setRootIndex(index);
        }
    });    
}

main.cpp

cpp 复制代码
#include <QApplication>
#include "ExplorerWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    ExplorerWindow window;
    window.show();
    
    return app.exec();
}
相关推荐
Quz12 小时前
QML TextField 应用:自动关联与表单提交
qt
sycmancia14 小时前
Qt——自定义控件温度计
开发语言·qt
艾莉丝努力练剑16 小时前
【Qt:问题解决】Qt程序入口点错误修复:MinGW ABI兼容问题
java·服务器·开发语言·qt·文件系统·动静态库
邱邱玩编程1 天前
读取位置 0x0000000000000000 时发生访问冲突 | QT | MFC
c++·qt·visualstudio
我是小灰灰吖1 天前
QT在线安装器使用指南:从下载到配置完整教程
linux·qt·ubuntu
C++ 老炮儿的技术栈1 天前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
我是小灰灰吖1 天前
Ubuntu 22.04 + Qt 6.9.3 应用程序打包与部署完整指南
qt·ubuntu
qq_401700411 天前
Qt自定义信号槽详解:带参发射 vs sender()获取,两种多信号关联方案全掌握
java·数据库·qt
郝学胜-神的一滴1 天前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
AI的探索之旅2 天前
嵌入式视觉学习路线:Qt + OpenCV + 工业相机,从零到综合项目
qt·opencv·学习