[PyQt] QListWidget, QTreeWidget 簡易範例

這是一個靠杯複雜的鬼東西、和各種容易誤解難懂難記的詭異概念,所以決定還是寫一篇簡單筆記,或許會對初學者有一點點的幫助。

List Model & View

Qt 中的 MVC 概念、各種 list model/view/controller 等,如果要搞清楚請一定要讀: Model/View Programming | Documentation | Qt Project

注意!這個部份我自己也看得一個頭五個大,以下有可能有記錯搞錯寫錯的地方,正確資訊還是以官方的 MVC 文件為主。如果您發現了錯誤敬請指正,謝謝。

來看看 Qt 到底有多少 List/Model/View 相關的玩意:

啊啊列不完啦。

因為實在太多了,其中差別我根本也記不住,但還是可以猜想做什麼事情時,該用什麼:

  • 如果你想用 QML,恭喜你,乖乖寫難寫得要命的 QAbstract*Model 吧,我不會告訴你怎麼寫的~
  • 一般情況請不要找自己麻煩,用 QListWidgetQTreeWidget, QTableWidget
    • 只需要單維 list 的話,用 QListWidget
    • 需要 multiple-columns 的 list、或者 tree list(檔案管理員中常見的那個)的話,用 QTreeWidget
    • 需要 multiple-columns 的 list、類似試算表那種東西的話,用 QTableWidget

QListWidgetQTreeWidget, QTableWidget 都是是把 Model, View, Controller 合在一個 widget 裡面,不需要自己搭配各種 Model + View(例如 QStandardItem + QStandardItemModel + QListView),用起來比較方便。

非常重要的概念:multiple-columns 的 list、item 與 role 的差別:

role 與 multiple-columns 是不同的概念,不要搞混。

Item roles

假設一個 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
2
3
self.list = QListWidget(self)
for i in range(10):
self.list.addItem('Item %s' % (i + 1))

範例:QTreeWidget:製作一個 Multiple Column 的 List

製作一個 multiple column 的 list(此處不需要用到 tree 結構),由於我們要用到多重 multiple colummn,必須使用 QTreeWidgetItem 來為每一個 item 建立其對應的各種 columns 內的資料。(這種概念很難記吧?)

1
2
3
4
5
6
7
8
itemList = []
for fileName in os.listdir(os.path.expanduser("~/"):
filePath = os.path.join(os.path.expanduser("~/"), fileName)
lineCount = sum(1 for line in open(filePath))
item = QtGui.QTreeWidgetItem()
item.setData(0, 0, fileName)
item.setData(1, 0, str(lineCount))
itemList.append(item)

item.setData(0, 0, fileName) 第 1 個參數就是指 column 編號,第 2 個參數則是 role 的編號。