QT M/V架構開發實戰:QFileSystemModel介紹

目錄

    • @[TOC](目錄)
  • 前言
  • 一、QFileSystemModel初步介紹
  • 二、基本功能
      • 1.創建
      • 2.基本屬性與方法
  • 三、示例(簡單的文件瀏覽器)
  • 四、性能注意事項

前言


本文主要介紹的是使用代碼生成的情況下對控件的介紹,包括擁有的功能及能修改的樣式,也會說明在qtdesiner拖拽控件生成和使用代碼生成控件的區別(如果有的話,遇到了的會說),此版本不屬于最終版本,以后遇到什么新奇的點會繼續更新!本文基于QT官方的文檔進行的編寫,QT版本為qt 5.14.0,編寫環境為Windows11。不得不說官方文檔真是個好東西,有時候有些不會的上去一看就能有靈感解決了,可惜沒有中文版本的。

一、QFileSystemModel初步介紹

QFileSystemModel是 Qt 提供的一個極其強大且實用的模型類,專門用于展示和操作本地文件系統。它抽象了文件系統的層次結構(目錄樹),并將其完美地適配到 Qt 的 Model-View 框架中,使得在 QTreeView、QListView或 QTableView中構建文件瀏覽器變得非常簡單。

?核心思想:??
QFileSystemModel繼承自 QAbstractItemModel(更具體地說,通常是 QDirModel的替代者,后者已廢棄)。
將本地文件系統的目錄結構映射為一個樹狀模型。
每個文件或目錄對應模型中的一個項 (QModelIndex)。
提供了豐富的接口來獲取文件屬性(名稱、路徑、大小、類型、修改時間、權限、圖標等)。
支持??異步加載??(默認),這意味著在后臺線程中讀取目錄內容,避免阻塞 UI 線程,尤其是在處理大型目錄或網絡驅動器時體驗更流暢。
自動監聽文件系統的變化(通過 QFileSystemWatcher),并在文件或目錄被添加、刪除、重命名或修改時??自動更新模型和視圖??。
讀寫操作(需謹慎):?? 支持通過模型接口重命名、刪除文件/目錄(需要權限)。

二、基本功能

1.創建

#include <QFileSystemModel>QFileSystemModel *model = new QFileSystemModel(parent);

2.基本屬性與方法

1)設置根路徑
關鍵一步??!告訴模型從哪個目錄開始構建樹狀結構。視圖(如 QTreeView)通常會自動展開并顯示此根路徑下的內容

// 設置根路徑為當前用戶的主目錄
model->setRootPath(QDir::homePath());// 設置根路徑為 C 盤 (Windows)
model->setRootPath("C:/");// 設置根路徑為根目錄 (Linux/macOS)
model->setRootPath("/");

2)連接視圖

QTreeView *treeView = new QTreeView;
treeView->setModel(model); // 設置模型// 通常,你會將視圖的根索引設置為模型的根路徑索引
treeView->setRootIndex(model->index(model->rootPath()));

3)獲取文件信息 (通過 QModelIndex或 QFileInfo)
使用 data()函數 (指定角色)

QModelIndex index = ...; // 例如 treeView->currentIndex() 或從選擇模型獲取// 文件/目錄名 (DisplayRole)
QString name = model->data(index, Qt::DisplayRole).toString();// 完整路徑 (FilePathRole - 這是 QFileSystemModel 特有的便捷角色)
QString fullPath = model->data(index, QFileSystemModel::FilePathRole).toString();
// 或者使用標準的 ToolTipRole 有時也會顯示路徑 (取決于視圖)
QString toolTipPath = model->data(index, Qt::ToolTipRole).toString();// 文件大小 (SizeRole) - 目錄通常返回 -1 或 0
qint64 size = model->data(index, QFileSystemModel::SizeRole).toLongLong();// 文件類型 (TypeRole) - 例如 "JPEG image", "Text Document", "Folder"
QString type = model->data(index, QFileSystemModel::TypeRole).toString();// 最后修改時間 (LastModifiedRole)
QDateTime lastModified = model->data(index, QFileSystemModel::LastModifiedRole).toDateTime();// 圖標 (DecorationRole)
QIcon icon = model->data(index, Qt::DecorationRole).value<QIcon>();

使用 fileInfo()(更直接)

QFileInfo fileInfo = model->fileInfo(index);
QString name = fileInfo.fileName();
QString fullPath = fileInfo.absoluteFilePath();
qint64 size = fileInfo.size();
bool isDir = fileInfo.isDir();
bool isFile = fileInfo.isFile();
QDateTime lastModified = fileInfo.lastModified();
QFile::Permissions perms = fileInfo.permissions();
// ... 使用 QFileInfo 的所有豐富接口 ...

4)過濾顯示的文件 (setFilter)
使用 QDir::Filters枚舉組合來指定哪些文件和目錄應該被顯示。QDir::NoDotAndDotDot:通常建議加上,以排除 .(當前目錄) 和 …(父目錄) 項。

// 只顯示目錄 (不顯示文件)
model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);// 顯示所有文件和目錄 (默認)
model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 通常排除 "." 和 ".."// 顯示所有文件 (包括隱藏文件) 和目錄
model->setFilter(QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot);// 只顯示 .txt 和 .cpp 文件以及所有目錄
model->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
model->setNameFilters(QStringList() << "*.txt" << "*.cpp");
model->setNameFilterDisables(false); // true: 隱藏不匹配項; false: 顯示但不匹配 (通常false)

5)排序 (sort)
視圖的列順序通常是:0=名稱, 1=大小, 2=類型, 3=修改日期 (取決于 headerData實現)。

// 按名稱排序 (默認)
treeView->setSortingEnabled(true); // 允許用戶點擊表頭排序
treeView->sortByColumn(0, Qt::AscendingOrder); // 按第0列(名稱)升序// 在代碼中指定排序 (例如按大小降序)
model->sort(2, Qt::DescendingOrder); // 假設大小在第2列 (需要根據視圖的列定義)

6)監聽目錄加載完成 (directoryLoaded信號)
由于加載是異步的,如果你需要在某個目錄內容加載完成后執行操作(如展開、選擇特定項),可以連接此信號。

connect(model, &QFileSystemModel::directoryLoaded,this, [this, model](const QString &path) {if (path == targetDirectoryPath) {// 找到并選中目標文件,或展開目錄等QModelIndex targetIndex = model->index(targetFilePath);treeView->setCurrentIndex(targetIndex);treeView->scrollTo(targetIndex);}
});
model->setRootPath(targetDirectoryPath); // 或者調用 fetchMore(index) 觸發加載

7)文件操作 (需謹慎!)
重命名 (setData)

QModelIndex oldIndex = ...;
bool success = model->setData(oldIndex, "NewFileName.txt", Qt::EditRole);
// 成功會觸發 dataChanged 信號,視圖更新
// 失敗通常是因為權限不足或文件正在使用

創建目錄 (mkdir)

QModelIndex parentDirIndex = ...; // 要在哪個目錄下創建
QModelIndex newDirIndex = model->mkdir(parentDirIndex, "NewFolderName");
if (!newDirIndex.isValid()) {// 創建失敗 (權限、重名等)
}

?刪除 (remove)

QModelIndex indexToRemove = ...;
bool success = model->remove(indexToRemove);
if (!success) {// 刪除失敗 (權限、文件不存在等)
}

注意事項:?? 這些操作會??直接作用于真實文件系統??!務必進行錯誤處理,并考慮提供用戶確認(如刪除確認對話框)。對于復雜的文件操作(復制、移動),通常建議使用 QFile、QDir或 QProcess調用系統命令,而不是依賴模型的 remove或 setData。

三、示例(簡單的文件瀏覽器)

#include <QApplication>
#include <QSplitter>
#include <QTreeView>
#include <QListView>
#include <QFileSystemModel>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 創建分割器窗口QSplitter *splitter = new QSplitter;// 創建模型QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::homePath()); // 設置根路徑model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); // 顯示所有項// 創建樹視圖 (左側 - 目錄樹)QTreeView *treeView = new QTreeView(splitter);treeView->setModel(model);treeView->setRootIndex(model->index(model->rootPath())); // 設置視圖根索引treeView->setSortingEnabled(true); // 允許排序treeView->setAnimated(true); // 展開折疊動畫treeView->setIndentation(20); // 縮進// 創建列表視圖 (右側 - 當前目錄內容)QListView *listView = new QListView(splitter);listView->setModel(model);listView->setViewMode(QListView::IconMode); // 圖標模式listView->setIconSize(QSize(64, 64)); // 圖標大小// 連接樹視圖的點擊信號,更新列表視圖的根索引QObject::connect(treeView, &QTreeView::clicked,[model, listView](const QModelIndex &index) {if (model->isDir(index)) {listView->setRootIndex(index); // 點擊目錄,在列表視圖中顯示其內容}});// 初始設置列表視圖顯示根目錄內容listView->setRootIndex(model->index(model->rootPath()));splitter->setWindowTitle("Simple File Browser");splitter->resize(800, 600);splitter->show();return app.exec();
}

四、性能注意事項

?1、大型目錄:?? 加載包含成千上萬文件的目錄會消耗內存和時間。考慮:
使用 QDir手動加載部分項(但這失去了 MV 自動更新的優勢)。
使用 QSortFilterProxyModel進行過濾,減少顯示項**。
提示用戶目錄很大。

2、??網絡驅動器/慢速介質:?? 異步加載尤為重要。directoryLoaded信號有助于知道何時加載完成。

??3、文件監控:?? QFileSystemWatcher可能會消耗資源(尤其是在 Windows 上監控大量文件)。如果不需要實時更新,可以考慮禁用(但 QFileSystemModel內部集成,沒有直接禁用選項,可能需要自定義模型)。

本次分享就到這里了,如果有什么錯誤的話請指正,或者有什么疑問的,也可以在評論區一起探討!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96476.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視頻生成迎來效率革命!字節提出視頻生成稀疏注意力機制,計算量降20倍,速度升17.79倍!

論文鏈接&#xff1a;https://arxiv.org/pdf/2509.01085亮點直擊BSA——一種可訓練的雙向動態稀疏注意力框架&#xff0c;該框架首次在視頻擴散訓練中對全注意力機制中的查詢&#xff08;Query&#xff09;及鍵值對&#xff08;Key-Value&#xff09;進行正交稀疏化處理以加速訓…

STM32HAL庫_cubeMX

ADC簡介STM32f103的是12位逼近型ADC代碼連續非掃描模式&#xff08;1個通道&#xff09;1&#xff1a;校準ADC&#xff08;這個可要可不要&#xff09;2&#xff1a;ADC初始化3&#xff1a;配置ADC通道&#xff08;這個函數只有一個通道時就是可要可不要&#xff09;4&#xff…

【Qt】清空QDateTimeEdit

代碼 ui->startDate->setSpecialValueText(" "); //這里是空格 ui->startDate->setMinimumDate(QDate(2024, 1, 1)); ui->startDate->setDate(QDate::fromString("2024-01-01", "yyyy-MM-dd"));原理 設置特殊值顯示文本&#…

LiTS 2017 datasets

下載記錄 論文地址&#xff1a;https://doi.org/10.1016/j.media.2022.102680 官方下載鏈接&#xff1a;https://competitions.codalab.org/competitions/17094 進入鏈接后&#xff0c;需要先注冊才能拿到下載點擊Train data下面的Mirro1&#xff0c;在google云盤會看到Trai…

kafka3.8集群搭建

kafka集群需要三臺機器搭建&#xff0c;并使用內置zookeeperIP10.0.0.110.0.0.210.0.0.3安裝jdk # ubuntu sudo apt install -y openjdk-8-jdk-headless # centos sudo yum install -y java-1.8.0-openjdk下載kafka wget https://archive.apache.org/dist/kafka/3.8.1/kafka_2…

從15kHz 到20MHz:為什么LTE帶寬不能被子載波間隔整除?

從 15 kHz 到 20 MHz&#xff1a;為什么 LTE 帶寬不能被子載波間隔整除&#xff1f; 1. 引言 在 LTE 系統中&#xff0c;子載波間隔被固定為 15 kHz&#xff0c;而系統帶寬卻被設計為 1.4、3、5、10、15、20 MHz 六個檔位。乍一看&#xff0c;這些帶寬似乎無法被 15 kHz 整除&a…

html css js網頁制作成品——HTML+CSS娃娃店網頁設計(4頁)附源碼

目錄 一、?????網站題目 二、??網站描述 三、??網站介紹 四、??網站效果 五、?? 代碼實現 ??HTML

【計算機網絡 | 第15篇】動態主機配置協議

文章目錄為何需要DHCP&#xff1f;手動配置的痛點&#x1f914;DHCP的基本工作模式&#x1f95d;DHCP的核心功能&#xff1a;IP地址的動態管理&#x1f95d;租用期的特點租用期的管理機制DHCP四步工作流程&#xff1a;從“發現”到“綁定”&#x1f426;?&#x1f525;中繼代理…

嵌入式系統內存分段核心內容詳解

一、嵌入式內存分段整體規則&#xff08;按地址從低到高&#xff09;嵌入式系統內存按 “功能 屬性” 劃分為 6 個核心段&#xff0c;地址從低到高依次分布&#xff0c;各段職責與存儲對象明確&#xff0c;具體規則如下表&#xff1a;地址范圍段類型&#xff08;Segment&#…

開發避坑指南(45):Java Stream 求兩個List的元素交集

需求 java 中如何用stream求兩個List元素的交集&#xff1f; 代碼實現 直接上代碼 public class ListTest {public static void main(String[] args) {List<Integer> list1 new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);List<Integer> list2 …

gitlab流水線與k8s集群的聯通

gitlab流水線與k8s集群的連接&#xff0c;首先是通過gitlab-ci.yml文件中的命令&#xff0c;通過runner執行器實例運行對應的kubectl命令實現的。 那么runner執行器實例執行器如何執行kubectl命令&#xff0c;執行環境的配置&#xff0c;kubectl命令如何與k8s集群互認&#xff…

【Linux】常用命令速查表

Linux 常用命令速查表查看進程內存映射pmap -x <pid> # 查看進程的內存映射信息查看系統架構uname -m # 查看操作系統架構&#xff08;x86_64 / arm64 等&#xff09;磁盤與文件du -sh /home/* # 查看 /home 下每個用戶目錄的大小&#x…

Windows下編譯SLEPc

本文記錄在Windows下編譯SLEPc的流程。 零、環境 操作系統Windows 11VS Code1.92.1MSYS2msys2-x86_64-20250830 一、安裝依賴 1.1、依賴 首先&#xff0c;下載并安裝MSYS2&#xff0c; 打開MSYS2 MINGW64控制臺&#xff0c;運行以下命令安裝依賴包&#xff0c; pacman -S …

運動生理實驗室解決方案 人體生理實驗整體解決方案

&#xff08;一&#xff09;、硬件參數 集成化折疊式無創型生理實驗平臺&#xff1a;1.1、 集成化設計:至少包含設備操作臺、可收納式交互實驗桌、可收納式檢查床、生物信號 采集處理系統、計算機工作站集成于一體的高度集成設計&#xff1b;&#xff08;o561-6o623…

Axure RP 9 最新版安裝包+安裝步驟Win系統適用(附安裝包)

Axure RP 9? 是一款專業的 ?原型設計工具&#xff0c;主要用于 ?網站、APP、軟件等產品的界面設計和交互原型制作。 一、準備工作 ?下載好安裝包? Axure RP 9安裝包下載&#xff1a;https://pan.quark.cn/s/bc2b35011106 二、開始安裝 第一步&#xff1a;雙擊運行安裝包…

AutoMQ 亮相首爾:KafkaKRU 分享日志流處理新思路

全球 Kafka 社區都在關注 AutoMQ&#xff01;憑借在 Kafka 生態的獨特創新&#xff0c;AutoMQ 深受 Kafka 用戶喜愛&#xff0c;已成為眾多企業和開發者的首選實時數據解決方案。昨天&#xff0c;我們非常高興看到來自韓國的 KafkaKRU 核心社區在首爾舉辦第2屆官方線下交流會。…

從零開始使用 axum-server 構建 HTTP/HTTPS 服務

axum-server 是 Rust 生態中為 axum 框架設計的高性能服務器實現&#xff0c;基于 hyper&#xff08;底層 HTTP 引擎&#xff09;和 tower&#xff08;服務抽象&#xff09;構建&#xff0c;支持 HTTP/1、HTTP/2 及 HTTPS。本教程將從環境準備到實戰功能&#xff0c;一步步帶你…

電路運行的核心-RTC

1. 時鐘芯片是什么&#xff1f;時鐘芯片&#xff0c;更準確的名稱是實時時鐘芯片&#xff0c;英文是 Real-Time Clock&#xff0c;簡稱 RTC。它是一個專用的集成電路&#xff0c;其核心功能是追蹤時間和日歷。你可以把它想象成電子設備里的一個“電子表”或“日歷鐘”。關鍵特性…

AR消防頭盔:火場救援的智能“透視眼”

在濃煙彌漫、能見度幾乎為零的火場中&#xff0c;消防員們依靠什么來精準掌握隊友的位置和狀態&#xff1f;答案是AR智能消防頭盔&#xff08; www.teamhelper.cn &#xff09;。這種頭盔通過多種定位技術的融合&#xff0c;為消防員提供了強大的團隊協作和指揮協同能力&#x…

基于大模型的個性化推薦系統實現探索與應用

前言 如果你一直在跟著Fanstuck博主的腳步探索AI大模型的相關內容&#xff0c;從最初的大模型Prompt工程解析&#xff0c;DeepSeek全面解析&#xff0c;到實際的私有化大模型開發部署&#xff0c;再到深入NL2SQL、知識圖譜大模型和ChatBI等更高階應用.我是Fanstuck&#xff0c…