qt5-入门-ModelView架构2-QDirModel&QFileSystemModel

参考:
QDirModel_w3cschool
https://www.w3cschool.cn/learnroadqt/emq31j4k.html

C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt 5.12


上一篇:
qt5-入门-ModelView架构1-CSDN博客
https://blog.csdn.net/pxy7896/article/details/136027518

QDirModel&QFileSystemModel

效果

在这里插入图片描述

实现

注意:

  • QDirModel 在最新版 Qt 中已经不建议使用了。文档中说使用 QFileSystemModel 代替
  • 与QDirModel 不同的是,QFileSystemModel会启动自己的线程进行文件夹的扫描,因此不会发生因扫描文件夹而导致的主线程阻塞的现象。

头文件:

#ifndef DMTREEVIEW_H
#define DMTREEVIEW_H

#include <QDirModel>
#include <QTreeView>
#include <QFileSystemModel>

class MyTreeView : public QWidget
{
        Q_OBJECT
public:
        MyTreeView();

private:
        //QDirModel *model;
        QFileSystemModel *model;
        QTreeView *treeView;

private slots:
        void mkdir();
        void rm();
};

#endif // DMTREEVIEW_H

源文件里大部分代码是QDirModel用的,QFileSystemModel用的会注明。

源文件:

#include "dmtreeview.h"

#include <QTreeView>
#include <QHeaderView>
#include <QHBoxLayout>
#include <QPushButton>
#include <QInputDialog>
#include <QMessageBox>


MyTreeView::MyTreeView() {
    //model = new QDirModel;
    model = new QFileSystemModel;
    model->setReadOnly(false);
    
    // QDirModel
    // 排序依据:文件夹优先、忽略大小写、名字
    //model->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);
    
    // QFileSystemModel
    model->setRootPath(""); // 需要设置根目录,QDirModel自动使用根目录
    // 似乎默认是文件夹优先,按名称升序了,这样设置就ok
    model->sort(0, Qt::AscendingOrder);
    
    // 似乎不需要观察或者手动刷新啊?
    //QFileSystemWatcher watcher;
    //watcher.addPath(model->rootPath());
    
    treeView = new QTreeView;
    treeView->setModel(model);
    // 当 QTreeView 的宽度大于所有列宽之和时,最后一列的宽度自动扩展
    // 以充满最后的边界;否则就让最后一列的宽度保持原始大小
    treeView->header()->setStretchLastSection(true);
    // 因为前面model设置了按名字排序,所以用0
    treeView->header()->setSortIndicator(0, Qt::AscendingOrder);
    // 显示排序按钮
    treeView->header()->setSortIndicatorShown(true);
    treeView->header()->setSectionsClickable(true);

    // 获取当前exe文件运行路径
    QModelIndex index = model->index(QDir::currentPath());
    treeView->expand(index);
    treeView->scrollTo(index);
    // 要求列头适应内容宽度,不折叠(...)
    treeView->resizeColumnToContents(0);
    // 两个按钮的布局
    QHBoxLayout *btnLayout = new QHBoxLayout;
    QPushButton *createBtn = new QPushButton(tr("Create Directory..."));
    QPushButton *delBtn = new QPushButton(tr("Remove"));
    btnLayout->addWidget(createBtn);
    btnLayout->addWidget(delBtn);
    // 总布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(treeView);
    mainLayout->addLayout(btnLayout);
    this->setLayout(mainLayout);

    connect(createBtn, SIGNAL(clicked()), this, SLOT(mkdir()));
    connect(delBtn, SIGNAL(clicked()), this, SLOT(rm()));
}

void MyTreeView::mkdir() {
    QModelIndex index = treeView->currentIndex();
    // 因为初始情况下没有选中目录,所以需要判断是否合法
    if (!index.isValid()) {
        return;
    }
    QString dirName = QInputDialog::getText(this,
                                            tr("Create Directory"),
                                            tr("Directory name"));
    if (!dirName.isEmpty()) {
        if (!model->mkdir(index, dirName).isValid()) {
            QMessageBox::information(this,
                                     tr("Create Directory"),
                                     tr("Failed to create the directory"));
        }
    }
}

void MyTreeView::rm() {
    QModelIndex index = treeView->currentIndex();
    if (!index.isValid()) {
            return;
    }
    bool ok;
    // 删除目录和文件使用不同的函数
    if (model->fileInfo(index).isDir()) {
        ok = model->rmdir(index);
    } else {
        ok = model->remove(index);
    }
    if (!ok) {
        QMessageBox::information(this,
                                 tr("Remove"),
                                 tr("Failed to remove %1").arg(model->fileName(index)));
    }
}

相关推荐

  1. qt5-入门-容器类

    2024-04-02 20:10:01       5 阅读
  2. QT入门Qt架构与三个窗口的区别

    2024-04-02 20:10:01       7 阅读
  3. python中qt5入门

    2024-04-02 20:10:01       23 阅读

最近更新

  1. leetcode705-Design HashSet

    2024-04-02 20:10:01       5 阅读
  2. Unity发布webgl之后打开streamingAssets中的html文件

    2024-04-02 20:10:01       5 阅读
  3. vue3、vue2中nextTick源码解析

    2024-04-02 20:10:01       6 阅读
  4. 高级IO——React服务器简单实现

    2024-04-02 20:10:01       5 阅读
  5. 将图片数据转换为张量(Go并发处理)

    2024-04-02 20:10:01       4 阅读
  6. go第三方库go.uber.org介绍

    2024-04-02 20:10:01       6 阅读
  7. 前后端AES对称加密 前端TS 后端Go

    2024-04-02 20:10:01       7 阅读

热门阅读

  1. Redis

    Redis

    2024-04-02 20:10:01      6 阅读
  2. Python零基础教学(数据类型)

    2024-04-02 20:10:01       6 阅读
  3. 在Linux中部署redis

    2024-04-02 20:10:01       6 阅读
  4. Jackson 2.x 系列【5】注解大全篇一

    2024-04-02 20:10:01       3 阅读
  5. C语言中,`while` 和 `for` 的区别

    2024-04-02 20:10:01       4 阅读
  6. 把本地项目上传到gitee上

    2024-04-02 20:10:01       4 阅读
  7. Debian 配置国内软件源

    2024-04-02 20:10:01       2 阅读
  8. Debian/Ubuntu安装ping和netstat命令

    2024-04-02 20:10:01       3 阅读
  9. 【python】dict转json存入sql

    2024-04-02 20:10:01       3 阅读
  10. 【算法集训】基础算法:双指针

    2024-04-02 20:10:01       3 阅读
  11. 李白打酒加强版(c++实现)

    2024-04-02 20:10:01       3 阅读
  12. 2024-03-27 问AI: 介绍一下深度学习中的 Darknet

    2024-04-02 20:10:01       3 阅读
  13. 33-2 XXE漏洞 - XXE外部实体注入原理

    2024-04-02 20:10:01       3 阅读