學完模型繼續學習視圖和委托。
Qt 學習之路 2(46):視圖和委托
Qt 學習之路 2(47):視圖選擇
Qt 學習之路 2(48):QSortFilterProxyModel
自定義模型的例子們很好很強大,好好學習!
Qt 學習之路 2(49):自定義隻讀模型
Qt 學習之路 2(50):自定義可編輯模型
Qt 學習之路 2(51):布爾表達式樹模型
視圖不僅僅用于展示資料,還用于在資料項之間的導航以及資料項的選擇。另外,視圖也需要支援很多基本的使用者界面的特性,例如右鍵菜單以及拖放。視圖可以提供資料編輯功能,也可以将這種編輯功能交由某個委托完成。視圖可以脫離模型建立,但是在其進行顯示之前,必須存在一個模型。也就是說,視圖的顯示是完全基于模型的,這是不能脫離模型存在的。對于使用者的選擇,多個視圖可以互相獨立,也可以進行共享。
一個較完整的例子:基于QItemDelegate的例子1 SpinBoxDelegate
又如何在Qt中自己建立選擇模型進行特殊的操作呢?要靠QItemSelectonModel。
Qt 使用QItemSelectionModel類擷取視圖中項目的選擇情況。這個模型保持有項目的索引,并且獨立于任何視圖。這意味着,我們可以讓不同的視圖共享同一個選擇模型,從來達到一種同步操作的目的。選擇由選擇區域組成。模型隻将選區的開始和結束的索引位置記錄下來,以保證對于很大的選區也有很好的性能。非連續選區則由多個連續選擇組成。
一個參考:QtCreator 子產品/視圖程式設計( 二) 項目選擇,QItemSelectionModel
再來了解一個用于資料篩選的類:QSortFilterProxyModel。
QSortFilterProxyModel并不能單獨使用。顧名思義,它是一個“代理”,其真正的資料需要另外的一個模型提供。它的作用是對資料進行排序和過濾。排序很好了解,而過濾,則是按照輸入的内容對資料及進行篩選,很像 Excel 裡面的過濾器。不過 Qt 提供的過濾功能是基于正規表達式的,功能很強大。
Q&A:
1.如何在QTableView裡面添加自定義的控件呢,不是createEditor,就是普通的顯示,看起來應該是在paint()函數裡面寫,但是不知道如何繪制自定義的控件。
用于顯示的元件可以通過自定義 delegate 實作。例如繼承 QItemDelegate 或者 QStyledItemDelegate,重寫其 paint() 函數。比如你想在裡面添加一個按鈕,就可以在 paint() 函數建立一個 QPushButton,然後用 QApplication::style()->drawControl() 把這個元件繪制出來。