C++ Qt開發:QFileSystemModel文件管理組件

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));
    }
}

運行後則可以通過點擊不同的目錄樹展開,由於設置了只過濾特定的文件所以此處顯示的結果如下所示;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章