QT做一个硬盘目录视图QTreeView,QDirModel







首先,我们来看一个很有用的model:QDirModel。这个model允许我们在view中显示操作系统的目录结构,

当然我们肯定要用到QTreeView。这次让我们先来看看运行结果:

首先,我们要建立一个QT的项目,然后呢点击项目属性,添加新文件,选择c++ Class,点击Choose输入一个类名,

接着在.h文件里面添加要用到的类

#ifndef MYTREEVIEW_H

#define MYTREEVIEW_H
#include <QWidget>
#include <QDirModel>
#include <QTreeView>
#include <QMainWindow>
class MyTreeView :public QWidget
{
        Q_OBJECT
public:
        MyTreeView();//构造
private:
        QDirModel *model;//定义模型变量
        QTreeView *treeView;//定义树视图
private slots:
        void mkdir();
        void rm();
};
#endif // MYTREEVIEW_H

接着就在.cpp文件里面去写代码了:

#include "mytreeview.h"

#include <QTreeView>
#include <QHeaderView>
#include <QHBoxLayout>//布局类
#include <QString>//文本类
#include <QPushButton>
#include <QInputDialog>
#include <QMessageBox>//
MyTreeView::MyTreeView()
{
        model = new QDirModel;//模型
        model->setReadOnly(false);//设置为只读
        model->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);//排序
        treeView = new QTreeView;//
        treeView->setModel(model);
        treeView->header()->setStretchLastSection(true);
        treeView->header()->setSortIndicator(0, Qt::AscendingOrder);
        treeView->header()->setSortIndicatorShown(true);
       // treeView->header()->setClickable(true);
        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)));
        }
}

然后在,main.cpp文件里面   

MyTreeView b;

    b.show();
就可以了







QTreeViewQt框架中的一个视图类,用于显示树状结构的数据。它是基于模型-视图-委托(Model-View-Delegate)设计模式的一个实现。 首先,我们需要创建一个QTreeView的实例,并设置其显示模式、选择模式以及其他一些属性。然后,我们需要创建一个QAbstractItemModel的子类作为QTreeView的数据模型,用于管理和提供数据。数据模型可以是自定义的,也可以使用Qt框架提供的一些预定义模型类(例如QStandardItemModel)。 数据模型需要重写几个关键函数,包括rowCount和columnCount函数,用于返回数据模型中行和列的数量;index和parent函数,用于返回项的索引和父索引;以及data函数,用于返回指定项的数据。此外,还可以重写headerData函数,用于设置列标题。 之后,我们可以使用数据模型的接口函数来插入、删除、修改数据。对于树状结构,还可以使用insertRow和insertColumn函数来插入行和列,使用removeRow和removeColumn函数来删除行和列。 最后,在QTreeView中显示数据的时候,我们可以使用setItemDelegate函数来自定义每个单元格的外观和行为。通过继承QStyledItemDelegate类,我们可以实现自定义的委托类,并重写paint函数和editorEvent函数,以实现自定义的绘制和交互效果。 总结起来,QTreeView提供了一个方便快捷的方式来显示和编辑树状结构的数据。通过创建数据模型并自定义委托类,可以实现丰富多样的效果。同时,QTreeView还提供了一套丰富的信号和槽函数,可用于响应用户的交互操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vqt5_qt6

你的鼓励是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值