這是一個靠杯複雜的鬼東西、和各種容易誤解難懂難記的詭異概念,所以決定還是寫一篇簡單筆記,或許會對初學者有一點點的幫助。
List Model & View
Qt 中的 MVC 概念、各種 list model/view/controller 等,如果要搞清楚請一定要讀: Model/View Programming | Documentation | Qt Project
注意!這個部份我自己也看得一個頭五個大,以下有可能有記錯搞錯寫錯的地方,正確資訊還是以官方的 MVC 文件為主。如果您發現了錯誤敬請指正,謝謝。
來看看 Qt 到底有多少 List/Model/View 相關的玩意:
啊啊列不完啦。
因為實在太多了,其中差別我根本也記不住,但還是可以猜想做什麼事情時,該用什麼:
- 如果你想用 QML,恭喜你,乖乖寫難寫得要命的
QAbstract*Model
吧,我不會告訴你怎麼寫的~ - 一般情況請不要找自己麻煩,用
QListWidget
、QTreeWidget
,QTableWidget
- 只需要單維 list 的話,用
QListWidget
。 - 需要 multiple-columns 的 list、或者 tree list(檔案管理員中常見的那個)的話,用
QTreeWidget
。 - 需要 multiple-columns 的 list、類似試算表那種東西的話,用
QTableWidget
。
- 只需要單維 list 的話,用
QListWidget
、QTreeWidget
,QTableWidget
都是是把 Model, View, Controller 合在一個 widget 裡面,不需要自己搭配各種 Model + View(例如QStandardItem
+QStandardItemModel
+QListView
),用起來比較方便。
非常重要的概念:multiple-columns 的 list、item 與 role 的差別:
role
與 multiple-columns 是不同的概念,不要搞混。
假設一個 single column list 有一堆 items,每個 item 自己也還會有一些屬性欄位能夠放不同資料,這種屬性欄位在 Qt 裡面叫做 role
。
一個 multiple columns list 有 rows x columns 個 items,每個 item 也都一樣有各自的 role
。
以 QAbstractListModel().roleName()
為例,其各個 item 預設都有如下的 roles(當然這些項目都還可以自由增減):
display
,decoration
,edit
,toolTip
,statusTip
,whatsThis
其中像是 display
就是顯示在 list 中的樣子(最常見就是字串),decoration
是圖示(如檔案管理員常見的各檔案類型的 icon), toolTip
就是滑鼠移上去會顯示的東西等等。
role 的詳細使用方式請自行翻文件。
範例:QListWidget
製作一個 single column 的 list
1 | self.list = QListWidget(self) |
範例:QTreeWidget:製作一個 Multiple Column 的 List
製作一個 multiple column 的 list(此處不需要用到 tree 結構),由於我們要用到多重 multiple colummn,必須使用 QTreeWidgetItem
來為每一個 item 建立其對應的各種 columns 內的資料。(這種概念很難記吧?)
1 | itemList = [] |
item.setData(0, 0, fileName)
第 1 個參數就是指 column 編號,第 2 個參數則是 role 的編號。