【Qt】实现显示指定路径目录结构

简介: 使用 Qt 的 QTreeView 显示指定路径下的目录结构

组件和结构

需要使用到 QDirModelQDir 库和 QTreeView 控件

计算机专业的应该知道 MVC 结构,Model - View - Controller ,模型 - 视图 - 控制器,分离代码,避免各种逻辑的代码冗杂在一起,为了使得代码结构清晰,也方便维护。

Qt 只有 MV 结构 Model-View,模型-视图,Controller 的部分集成在 View 中。设置一种数据的模型,使视图整体显示

实现

创建一个图形界面项目,主界面继承自 QMainWindow 。

在 ui 界面可以只设置一个 QTreeView 保留其默认名称 treeView

#include <QDirModel>
//...
class MainWindow : public QMainWindow
{
   
   
    Q_OBJECT
//...

private:
    QDirModel* m_dirModel;
};

头文件中只需要包含头文件 QDirModel,并添加私有成员变量 QDirModel* m_dirModel

源文件中,在构造函数中完成所有的设置,需要包含头文件 QDir 用于设置目录相关属性,初始化指针成员变量 m_dirModel,

#include <QDir>

MainWindow::MainWindow()
{
   
   
//...
QStringList filters;
filters << "*.cpp" << "*.h";
//...
m_dirModel = new QDirModel(filters, QDir::NoDotAndDotDot|QDir::AllDirs|QDir::Files, QDir::Name);

添加 filters 文件类型过滤,过滤只显示扩展名为 cpp 和 h 的文件,也可以不设置。

然后创建 QDirModel ,给予设置好的过滤为第一个参数,第二个参数为添加 QDir 的属性,属性之间使用逻辑或 |

属性 说明
QDir::NoDotAndDotDot 不包含 ... 目录
QDir::AllDirs 所有的目录
QDir::AllFiles 所有的文件

第三个参数为排序方法,设置为 QDir::Name,以文件名的方式排序

接下来设置模型和视图

m_dirModel->setReadOnly(true);

ui->treeView->setModel(m_dirModel);
ui->treeView->setColumnHidden(1, true);
ui->treeView->setColumnHidden(2, true);
ui->treeView->setColumnHidden(3, true);

设置模型为只读,不可修改,否则点击界面会意外触发修改文件或目录的名称。

使用 treeView 的 setModel 方法,将模型和视图联系起来,并设置1-3列内容隐藏,不显示详细列表大小,类型和修改时间,只显示目录和文件的名称。

最后设置指定路径,使用 treeView 的 setRootIndex 方法

ui->treeView->setRootIndex(m_dirModel->index("D:\\SomeDirectory"));

效果图:
treeView.png

完整代码,头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDirModel>
QT_BEGIN_NAMESPACE
namespace Ui {
   
    class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
   
   
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


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

源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
   
    ui->setupUi(this);
    QStringList filters;
    filters << "*.cpp" << "*.h";

    m_dirModel = new QDirModel(filters, QDir::NoDotAndDotDot|QDir::AllDirs|QDir::Files, QDir::Name);

    m_dirModel->setReadOnly(true);

    ui->treeView->setModel(m_dirModel);
    ui->treeView->setColumnHidden(1, true);
    ui->treeView->setColumnHidden(2, true);
    ui->treeView->setColumnHidden(3, true);
    ui->treeView->setRootIndex(m_dirModel->index("D:\\SomeDirectory"));

}

MainWindow::~MainWindow()
{
   
   
    delete ui;
}
目录
相关文章
|
6月前
win11查看文件/文件夹所使用的程序
win11查看文件/文件夹所使用的程序
52 0
|
6月前
|
开发框架 前端开发 算法
【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件
【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件
315 0
|
otter Java 网络安全
`fastsql-2.0.0_preview_135.pom` 文件没有下载或者没有放置到正确的路径
`fastsql-2.0.0_preview_135.pom` 文件没有下载或者没有放置到正确的路径
83 1
【VSCode】当前工作目录非当前文件夹/pathlib打印cwd路径错误
【VSCode】当前工作目录非当前文件夹/pathlib打印cwd路径错误
119 0
|
编译器
VC6工程目录下的文件说明
VC6工程目录下的文件说明
150 0
|
Python
Python 技术篇-打开指定文件夹、目录、路径方法,运行指定文件演示
Python 技术篇-打开指定文件夹、目录、路径方法,运行指定文件演示
825 0
Python 技术篇-打开指定文件夹、目录、路径方法,运行指定文件演示
分享Qt多工程多目录的编译案例,subdirs(一)
分享Qt多工程多目录的编译案例,subdirs(一)
1121 0
分享Qt多工程多目录的编译案例,subdirs(一)
|
机器学习/深度学习 Python
查找某文件夹下所有子文件夹内的py文件-3 一行代码搞定
转自:https://mp.weixin.qq.com/s/FFXh8gRci4hMo6_gnBMPUg       工作中,有时会产生查找某一类文件的需求,比如log文件。或者在做图像类深度学习时,需要读取大类文件夹下,所有小类文件夹下的图片。
1431 0
|
Python
查找某文件夹下所有子文件夹内的py文件
import globimport os fp = '/Users/../Desktop'pylist = []def get_py(fp): filelist = glob.glob(os.path.
1440 0