引言
今天我将使用model/view模型视图框架来完成一个简单的Qt文件管理系统,主要使用到了QTreeView、QTabelView视图和QFileSystemModel文件系统模型。
界面设计
使用Qt创建项目并勾选创建ui文件,打开ui文件,使用Tree View、Table View、Stacked Widget以及布局来构建如下界面,当然也可以使用代码来完成界面设计。
系统功能
实现功能如下:
左侧树形视图:显示整个文件系统的目录结构。用户可以通过展开和折叠节点来浏览不同的目录。
右侧表格视图:显示当前选中的目录中的文件和子目录。当用户在树形视图中点击某个目录时,表格视图会更新为该目录下的内容。
交互逻辑:
在树形视图中点击某个目录,表格视图会显示该目录下的内容。
在表格视图中点击某个子目录,表格视图会进入该子目录并显示其内容。
创建窗口分裂器,用于将窗口分为两部分,允许用户通过拖动分割条来调整两部分的大小。
// 窗口分裂器
auto splitter = new QSplitter();
splitter->addWidget(ui->naviTreeView);
splitter->addWidget(ui->stackedWidget);auto hlayout = new QHBoxLayout(this);
hlayout->addWidget(splitter);
创建文件系统模型
// 文件系统模型
QFileSystemModel* model =new QFileSystemModel(this);
model->setRootPath("");
//model->setFilter(QDir::Dirs | QDir::NoDotAndDotDot); // 只显示目录不包括.和..
视图设置模型
// 树视图
ui->naviTreeView->setModel(model);
// 表格视图
ui->tableView->setModel(model);
为树视图隐藏多余的列
// 隐藏除第一列的所有列
for(size_t i = 1;i<model->columnCount();++i)
{
ui->naviTreeView->setColumnHidden(i,true);
}
树视图和表格视图的点击事件
connect(ui->naviTreeView,&QTreeView::clicked,[=](const QModelIndex& index){
ui->tableView->setRootIndex(index);
});connect(ui->tableView,&QTableView::clicked,[=](const QModelIndex& index){
auto idx = model->index(index.row(),0,ui->tableView->rootIndex());
ui->tableView->setRootIndex(idx);
});
至此,Qt文件管理系统便已完成,至于其他功能有需要可以在此基础上进行完善。