PyQt(Python+Qt)学习随笔:model/view架构中的排序和代理模型QSortFilterProxyModel
老猿Python博文目錄
專欄:使用PyQt開發圖形界面Python應用
老猿Python博客地址
一、概述
在Model/View體系架構中,有兩種方法可以進行排序;選擇哪種方法取決于底層模型。
如果模型是可排序的,即模型類實現了QAbstractItemModel.sort()函數,如QTableView和QTreeView都提供一個API,允許以編程方式對模型數據進行排序。此外,還可以通過將QHeaderView.sortIndicatorChanged()信號連接到QTableView .sortByColumn()槽函數或QTreeView.sortByColumn()槽函數來啟用交互式排序(即允許用戶通過單擊視圖的標題對數據進行排序)。
另一種方法是,如果模型沒有所需的接口,或者想使用列表視圖(list View)來顯示數據,則在視圖中顯示數據之前,使用代理模型來轉換模型的結構。
二、代理模型
2.1、概述
在Model/View框架中,單個模型提供的數據項可以由任意數量的視圖共享,并且每個視圖可能以完全不同的方式表示相同的信息。自定義視圖和代理是為同一數據提供完全不同展示結果的有效方法。但應用程序通常需要為相同數據的已處理版本提供常規視圖,例如為列表數據提供不同排序的展現視圖。
盡管將排序和篩選操作作為視圖的內部方法來執行看起來可行,但是排序和篩選操作代價高,如果存在多個視圖展示相同的數據時,每個視圖數據排序按不同方式排序,如果每個視圖實現類似的方法,這種操作代價高昂。
另一種方法就是在模型本身對數據進行排序,這導致每個視圖都必須顯示根據最近的排序或刷選操作處理后的數據項,同樣代價高。
為了解決這個問題,Model/View框架使用代理模型來管理在各個模型和視圖之間交互的信息。代理模型是一些組件,從視圖的角度來看,它們的行為類似于普通Model,并代表該視圖訪問源模型中的數據。Model/View框架使用的信號和槽機制確保無論在其自身和源模型之間放置了多少代理模型,每個視圖都會得到適當的更新。
老猿理解代理模型就是提供在其他的model和view之間排序和過濾數據的支持功能使用的的,在代理模型中可以對項進行排序和篩選,這種方法允許一個model采用和其視圖功能匹配的要求重新組織,但不需要在數據和源模型上做任何處理,也不需要復制內存中的數據,可以有效提高效率。
2.2、使用代理模型
代理模型可以插入到現有模型和任意數量的視圖之間。PyQt和Qt提供了一個標準的代理模型QSortFilterProxyModel,它通常是直接實例化和使用的,但也可以從其派生子類來提供自定義的篩選和排序行為。
QSortFilterProxyModel類可以按以下方式使用:
1. 定義代理模型對象
語法:proxyModel = QSortFilterProxyModel((QObject parent)
2. 設置代理模型的數據源模型
語法:代理模型.setSourceModel(數據源模型)
其中代理模型就是第一步定義的模型,數據源模型即前面第三部分介紹的Model,為真正訪問數據的模型。
3. 設置視圖對應模型為代理模型
語法:視圖.setModel(proxyModel )
2.3、代理模型小結
從以上語法看到,代理模型本身對外是個Model,但自身的數據源也是個Model。
由于代理模型繼承自QAbstractItemModel,因此它們可以連接到任何類型的視圖,并且可以在視圖之間共享。它們還可用于從其他代理模型獲得信息,類似代理模型到數據Model之間象管道一樣排列使用。
QSortFilterProxyModel類被設計為實例化并直接在應用程序中使用,也可以通過特殊派生的子類實現所需的比較操作,從而創建更專門的代理模型。
QSortFilterProxyModel的具體過濾和刷選的方法請參考類相關的方法介紹,在此不進行展開說明。
老猿Python,跟老猿學Python!
老猿Python博文目錄
專欄:使用PyQt開發圖形界面Python應用
老猿Python博客地址
總結
以上是生活随笔為你收集整理的PyQt(Python+Qt)学习随笔:model/view架构中的排序和代理模型QSortFilterProxyModel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac快速打开资源库文件夹(Librar
- 下一篇: 自己动手写工具:自动点击小插件