组件和结构
需要使用到 QDirModel,QDir 库和 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"));
效果图:
完整代码,头文件:
#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;
}