這兩個(gè)類的功能很相似,都是從 QAbstractItemModel 的派生的,都可以和 任何 ItemView類配合使用。
但是 QT 沒理由提供兩個(gè)一模一樣的類,對(duì)吧。
最重要的區(qū)別是,QFileSystemModel是擁有獨(dú)立線程的,對(duì)于文件目錄的獲取也是異步方式的。
比如,當(dāng)你創(chuàng)建了 QFileSystemModel的對(duì)象,并且setRootPath后,rowCount返回值依然是 0,因?yàn)槊杜e目錄的操作是異步的可能還沒開始呢,這點(diǎn)和QDirModel不一樣。
實(shí)際上,當(dāng)你構(gòu)建好了一個(gè) QFileSystemModel后,一個(gè)thread也同時(shí)被創(chuàng)建了,這就是 QFileSystemModel的一個(gè)私有成員變量,fileInfoGatherer
這個(gè)對(duì)象的類型實(shí)際上是 QThread的派生類,所以它其實(shí)代表了一個(gè)線程。
通過調(diào)用 fileInfoGatherer->list(...) 給這個(gè)線程發(fā)送枚舉目錄的請(qǐng)求,當(dāng)線程完成工作后,在通過一系列 xxx_change 信號(hào)通知QFileSystemModel。
當(dāng)Model發(fā)現(xiàn)目錄數(shù)據(jù)有變化的時(shí)候 再通過一些Model的信號(hào)通知它所在的ItemView,從而完成這個(gè)異步的目錄枚舉過程。
使用 QFileSystemModel的好處是很明顯的,可以避免在目錄下文件太多的時(shí)候 UI發(fā)生卡死現(xiàn)象,同樣如果枚舉的目錄來自遠(yuǎn)程,比如網(wǎng)絡(luò)目錄,也可以減少UI的阻塞。
另外,還有一個(gè)好處就是 QFileSystemModel內(nèi)置了對(duì)目錄變化的監(jiān)視,這是通過 QFileSystemWatcher 類來實(shí)現(xiàn)的,所以用QFileSystemModel就不用擔(dān)心目錄文件變化了,當(dāng)有變化發(fā)生ItemView自然會(huì)收到更新的信號(hào)。
此外,以上這些都已經(jīng)完全移植到了Symbian。