C++ Qt開發:QFileSystemModel檔案管理元件

lyshark發表於2024-03-08

Qt 是一個跨平臺C++圖形介面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以透過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用QFileSystemModel元件實現檔案管理器功能。

QFileSystemModel是Qt框架中的一個關鍵類,用於在Qt應用程式中管理和展示檔案系統的結構。該模型提供了一個方便的介面,使得開發者可以輕鬆地在應用程式中整合檔案和目錄的樹形結構,並透過檢視元件(如QTreeViewQListViewQTabView等)展示給使用者。

以下是 QFileSystemModel 類的一些重要函式:

函式 描述
QFileSystemModel(QObject *parent = nullptr) 建構函式,建立一個 QFileSystemModel 物件。
void setRootPath(const QString &path) 設定模型的根路徑,指定從哪個目錄開始顯示檔案系統。
QString rootPath() const 獲取模型的根路徑。
void setFilter(QDir::Filters filters) 設定目錄過濾器,用於過濾顯示的檔案和目錄。
void setResolveSymlinks(bool enable) 設定是否解析符號連結。
void sort(int column, Qt::SortOrder order) 對指定列進行排序。
QModelIndex index(const QString &path, int column = 0) const 根據檔案路徑和列號獲取模型索引。
QFileInfo fileInfo(const QModelIndex &index) const 獲取給定索引處的檔案資訊。
bool mkdir(const QModelIndex &index, const QString &name) 在給定索引處的目錄中建立新目錄。
bool rmdir(const QModelIndex &index) 刪除給定索引處的目錄。
bool remove(const QModelIndex &index) 刪除給定索引處的檔案。
void directoryLoaded(const QString &path) 在目錄載入完成時發射的訊號。
void fileRenamed(const QString &path, const QString &oldName, const QString &newName) 在檔案重新命名時發射的訊號。
QModelIndex setRootPath(const QString &path) 設定根路徑,並返回表示新路徑的模型索引。
QString filePath(const QModelIndex &index) const 獲取給定索引處的檔案路徑。
void setReadOnly(bool enable) 設定模型為只讀模式。
bool isReadOnly() const 判斷模型是否為只讀模式。
void setNameFilters(const QStringList &filters) 設定名稱過濾器,用於限制模型中顯示的檔案型別。
QStringList nameFilters() const 獲取當前的名稱過濾器。
void setRootIndex(const QModelIndex &index) 設定根索引。
QModelIndex rootIndex() const 獲取當前的根索引。
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const 獲取模型索引。
QModelIndex parent(const QModelIndex &index) const 獲取給定索引的父索引。
int rowCount(const QModelIndex &parent = QModelIndex()) const 獲取給定父索引下的行數。
int columnCount(const QModelIndex &parent = QModelIndex()) const 獲取給定父索引下的列數。
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const 獲取模型資料。

當需要使用此模型時,我們需要匯入QFileSystemModel元件, 並在主類內定義QFileSystemModel型別的模型指標,並在主函式內透過new QFileSystemModel新建類,透過model->setRootPath設定預設停留的指標位置,最後呼叫model->setNameFilters設定過濾器,此處我們只需要顯示*.exe,*.txt,*.mp4三種格式即可,最後使用ui->treeView->setModel將此模型設定到元件內即可,其完整程式碼非常簡單,如下所示;

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 新建類指標
    model=new QFileSystemModel(this);

    // 設定根目錄
    model->setRootPath(QDir::currentPath());

    // 設定過濾器,只過濾出txt,mp4
    QStringList filter;
    filter << "*.txt" << "*.mp4";

    // 使用過濾器
    model->setNameFilters(filter);
    model->setNameFilterDisables(false);

    // 設定資料模型
    ui->treeView->setModel(model);
}

資料模型內的選中項可透過使用模型內提供的各種方法來實現取值,例如使用model->isDir可獲取到是否為目錄,透過model->filePath則可用於得到檔案的路徑等。

// 被點選後觸發
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    // 是否是目錄
    ui->chkIsDir->setChecked(model->isDir(index));
    // 檔案路徑
    ui->LabPath->setText(model->filePath(index));

    // 檔案型別
    ui->LabType->setText(model->type(index));

    // 檔名
    ui->LabFileName->setText(model->fileName(index));

    // 檔案的大小
    int sz=model->size(index)/1024;
    if (sz<1024)
    {

        ui->LabFileSize->setText(QString("%1 KB").arg(sz));
    }
    else
    {
        ui->LabFileSize->setText(QString::asprintf("%.1f MB",sz/1024.0));
    }
}

執行後則可以透過點選不同的目錄樹展開,由於設定了只過濾特定的檔案所以此處顯示的結果如下所示;

相關文章