Qt 檔案模型(QFileSystemModel)詳細介紹

一杯清酒邀明月發表於2024-06-21

一.定義
  Qt提供了QFileSystemModel類,用於在Qt應用程式中展示檔案系統的資料。QFileSystemModel類是QAbstractItemModel的子類,可以方便地將檔案系統的檔案和資料夾結構作為資料模型,供Qt的檢視類(比如QTreeView、QListView等)使用。

二.功能

  1. 設定根路徑:使用setRootPath()方法設定檔案系統的根路徑。
  2. 獲取檔案和資料夾資訊:使用rowCount()和data()方法來獲取檔案和資料夾的資訊,比如檔名、檔案大小、檔案型別等。
  3. 獲取檔案索引:使用index()方法獲取檔案或資料夾在模型中的索引。
  4. 監聽檔案系統變化:使用directoryLoaded()訊號來監聽檔案系統目錄載入完成的訊號,directoryChanged()訊號來監聽檔案系統目錄變化的訊號。
  5. 排序和過濾:可以使用sort()方法進行排序,setNameFilters()方法來過濾檔案型別。

三.程式碼示例

 1 #include <QApplication>
 2 #include <QTreeView>
 3 #include <QFileSystemModel>
 4 #include <QDir>
 5 #include <QDebug>
 6  
 7 int main(int argc, char *argv[])
 8 {
 9     QApplication a(argc, argv);
10     
11     // 建立一個QFileSystemModel物件
12     QFileSystemModel model;
13     
14     // 設定檔案系統的根路徑為當前工作目錄
15     QString rootPath = QDir::currentPath();
16     model.setRootPath(rootPath);
17     
18     // 建立一個QTreeView物件,並將QFileSystemModel設定為其模型
19     QTreeView treeView;
20     treeView.setModel(&model);
21     
22     // 設定QTreeView的根索引為模型的根目錄索引
23     QModelIndex rootIndex = model.index(rootPath);
24     treeView.setRootIndex(rootIndex);
25  
26     // 列印根路徑下的子檔案和子資料夾名
27     int rowCount = model.rowCount(rootIndex);
28     for (int i = 0; i < rowCount; ++i) {
29         QModelIndex childIndex = model.index(i, 0, rootIndex);
30         QString childName = model.fileName(childIndex);
31         qDebug() << "Child Name:" << childName;
32     }
33  
34     treeView.setWindowTitle("File System Viewer");
35     treeView.show();
36     
37     return a.exec();
38 }

四.模型索引介紹
  在Qt中,資料模型(例如QFileSystemModel)中的索引是用來標識模型中的特定資料項(如檔案、資料夾等)的物件。索引由兩個主要部分組成:行號和列號。在一維資料模型中,索引只包含行號,而在二維資料模型中,索引包含行號和列號。

  索引可以透過模型的index()方法來建立,該方法接受行號和列號引數,並返回一個QModelIndex物件,用於標識模型中特定位置的資料。QModelIndex包含了與資料項相關的資訊,例如父索引、有效性檢查等。

  在QFileSystemModel中,每個檔案和資料夾都用一個唯一的索引標識。根索引通常是模型的頂層索引,表示整個檔案系統的根目錄。您可以透過呼叫model.index(row, column, parentIndex)方法來獲取特定行和列處的索引,在這裡,row和column分別表示行號和列號,parentIndex表示父索引。

  在示例程式碼中,我們首先使用model.index(rootPath)獲取了根目錄的索引,然後透過model.index(i, 0, rootIndex)獲取了子檔案和子資料夾的索引。這些索引可以用於獲取對應資料項的資訊,如檔名、大小等。

相關文章