QT控件文件系统的实现

实现文件系统采用model-view的模式,qfilesystemmodel和treeview来实现。首先布局需要一个treeview,这是最关键的,然后是qpushbutton之类的。qfilesystemmodel实现了对文件系统的访问管理,我们可以引入一个qfiledialog,当点击按钮的时候弹出一个窗口,显示界面设置为homepath。代码如下:

//按钮触发槽函数
void MainWindow::printdialog()
{
    QString selectpath=QFileDialog::getExistingDirectory(this,
                                                           "选择要打开的目录",
                                                           QDir::homePath(),
                                                           QFileDialog::ShowDirsOnly);
    if(selectpath.isEmpty()){return;}
    //将选择的路径作为model显示路径,model只是关注到这里
    model->setRootPath(selectpath);
    //同时还需要绑定view的根索引,这样view才会更新
    ui->treeView->setRootIndex(model->index(selectpath));

    label->setText("当前的目录:"+selectpath);
}

我们将qfiledialog放在槽函数里面,实现每次点击就弹窗选择目录,有几个地方要注意一下:

1.model->setrootpath();这一句是设置model关注的根路径。

2.ui->treeview->setrootindex();这一句是设置treeview的根路径,必须要设置,不然他没法做到显示和model同时更新

最后绑定一下就大致完成了:

connect(ui->btnopen,&QPushButton::clicked,this,&MainWindow::printdialog);

下面是补充的一些功能:

  • 过滤文件类型:使用 setFilter() 控制显示内容(例如只显示图片文件):

    // 显示所有文件和目录(排除 "." 和 "..")
    model->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
    model->setNameFilters({"*.jpg", "*.png"}); // 仅显示 JPG 和 PNG 文件
    model->setNameFilterDisables(false);// 隐藏不符合条件的文件(true 则显示为禁用状态)

通过模型索引 (QModelIndex) 可获取丰富的文件信息:

// 获取文件路径
QString path = model->filePath(index);

// 获取文件名
QString name = model->data(index, QFileSystemModel::FileNameRole).toString();

// 获取文件图标
QIcon icon = model->data(index, QFileSystemModel::FileIconRole).value<QIcon>();

// 判断是否为目录
bool isDir = model->isDir(index);

 如果是想通过操作视图修改文件系统的功能有两种方法,第一种是启用treeview自己的基础编辑功能,无需代理

 // 启用视图的编辑功能(默认支持双击重命名)
    ui->treeView->setEditTriggers(QAbstractItemView::DoubleClicked | 
                                QAbstractItemView::EditKeyPressed);

添加删除/新建文件的上下文菜单​(可选):

// 在 MainWindow 类中添加:
private slots:
    void onCustomContextMenu(const QPoint &pos);
    void deleteFile();
    void newFolder();

// 在构造函数中启用上下文菜单策略:
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeView, &QTreeView::customContextMenuRequested, 
        this, &MainWindow::onCustomContextMenu);

实现上下文菜单功能

void MainWindow::onCustomContextMenu(const QPoint &pos) {
    QModelIndex index = ui->treeView->indexAt(pos);
    if (!index.isValid()) return;

    QMenu menu;
    QAction *deleteAction = menu.addAction("删除");
    QAction *newFolderAction = menu.addAction("新建文件夹");
    
    connect(deleteAction, &QAction::triggered, this, &MainWindow::deleteFile);
    connect(newFolderAction, &QAction::triggered, this, &MainWindow::newFolder);
    
    menu.exec(ui->treeView->viewport()->mapToGlobal(pos));
}

void MainWindow::deleteFile() {
    QModelIndex index = ui->treeView->currentIndex();
    if (index.isValid()) {
        // 删除文件或目录
        model->remove(index);
    }
}

void MainWindow::newFolder() {
    QModelIndex parentIndex = ui->treeView->currentIndex();
    if (parentIndex.isValid()) {
        // 创建新目录
        QModelIndex newFolderIndex = model->mkdir(parentIndex, "新建文件夹");
        if (newFolderIndex.isValid()) {
            ui->treeView->edit(newFolderIndex);  // 自动进入编辑状态
        }
    }
}

方案二 配置代理(明天继续) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值