Qt 是一個跨平臺C++圖形介面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以透過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用QFileSystemModel
元件實現檔案管理器功能。
QFileSystemModel是Qt框架中的一個關鍵類,用於在Qt應用程式中管理和展示檔案系統的結構。該模型提供了一個方便的介面,使得開發者可以輕鬆地在應用程式中整合檔案和目錄的樹形結構,並透過檢視元件(如QTreeView
、QListView
、QTabView
等)展示給使用者。
以下是 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));
}
}
執行後則可以透過點選不同的目錄樹展開,由於設定了只過濾特定的檔案所以此處顯示的結果如下所示;