引言
今天我將使用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文件管理系統便已完成,至于其他功能有需要可以在此基礎上進行完善。