1. 程式人生 > >Qt中使用QDirModel / QFileSystemModel + QTreeView顯示Checkbox複選框

Qt中使用QDirModel / QFileSystemModel + QTreeView顯示Checkbox複選框

需要編寫一個QDirModel / QFileSystemModel的子類,重寫QDirModel / QFileSystemModel的flags( )data( )setData( )方法。

定義一個QSet<QPersistentModelIndex>,名為checkedIndexes,用於記錄Checked的路徑名。

flags( )中返回 ItemIsUserCheckable

data( )中判斷給定的項是否在checkedIndexes中,有的話就返回Qt::Checked,沒有 就返回Qt::Unchecked

setData( )則把值為Qt::Checked

的給定項,以及給定項的所有子孫節點,全都新增到checkedIndexes裡。

recursiveCheck( )用於遞規新增子節點。

下面的程式碼是基於QDirModel寫的。如果用QFileSystemModel,選擇資料夾時,自動選擇子節點不太好實現,因為QFileSystemModel是非同步載入,在載入之前rowCount( )總是返回0。可以通過QDirIterator來遍歷所有子節點,這樣雖然能實現功能,但有個缺點,會打亂檔案的排列順序。我沒找到好的解決辦法,所以如果檔案較少時,還是採用QDirModel。

CFileSystemModel.h

 

CFileSystemModel.cpp