实现文件系统采用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); // 自动进入编辑状态
}
}
}
方案二 配置代理(明天继续)