在beta迭代中,咱們選擇用pyqt5來重寫alpha迭代中使用tkinter庫編寫的界面。python
按鈕之類的與tkiner使用無異,在顯示「測試報告」和「測試隊列」這方面,我打算使用列表類控件,可是在qt designer中發現了兩個看起來相似的控件:QListView和QListWidget。這兩個控件有什麼區別呢? 從文檔中我得知,QListWidget
是繼承自QListView
的,其餘Widget容器也是繼承自對應View容器,而QListView
是繼承自一個抽象基類QAbastractItemView
(python中採用@abstractmethod
實現),三者之間有着如下關係:數據庫
可是知道QListView
是QListWidget
的一個子類,只是知道了他們的聯繫,彷佛仍是不能直觀反映他們的區別。數據結構
咱們能從網上找到一個不錯的解釋:架構
QListView 裏沒有本身的"模型"要本身建模來保存數據,這能夠很大程度上下降數據冗餘,提升程序的效率.可是要求咱們對view/model框架比較瞭解,不適合新手使用.
QListWidget是QListView的子類,在QListWidget中已經幫咱們定義好了一個模型.這個模型很是方便,十分全面.這樣就能夠直接在QListWidget裏面添加數據,而不用在重新制定一個模型了.十分方便.框架其實QListView和QListWidget的主要區別就是有木有本身的模型而已.函數
View類別容器和Widget類別容易主要區別就在於「模型」。那麼什麼是模型呢?模型是將數據從視圖中分離出來的產物,提供和數據交互的接口。Widget類型容器內置了一個簡單的模型,咱們能夠直接調用實例的addItem()
、addItems()
方法來給Widget添加元素,相應變化會直接反映到界面上。而View類別採用了所謂的view/model框架,對視圖和數據進行了分離、解耦。Widget部件並無被設計爲能夠從視圖中分離數據。View類型和Widgt類型看起來相同,但它們與數據的交互方式不一樣。測試
框架
view/model框架是qt在qt4之後的版本中用來處理數據和麪向用戶的最終顯示的之間的關係,這種架構也容許使用不一樣界面顯示同一數據,也可以在不改變數據的狀況下添加新的顯示界面,而這是普通的widget類控件作不到的。除了view和model之外,qt還引入了委託(delegate),用來自定義數據項的渲染和編輯。三者的關係以下:設計
因爲咱們組項目目前階段數據的展現較爲簡單,選擇了相對易用的QListWidget
做爲顯示數據的方式,所以還未對view/model框架和委託有較爲深刻的研究。code
全部的模型都是QAbstractItemModel
的子類。這個類定義了供視圖和委託訪問數據的接口。模型並不存儲數據自己。這意味着能夠將數據存儲在一個數據結構中、另外的類中、文件中、數據庫中,或者其餘所能想到的東西中。blog
QAbstractItemModel
提供的接口足夠靈活,足以應付以表格、列表和樹的形式顯示的數據。可是,若是須要爲列表或者表格設計另外的模型,直接繼承QAbstractListModel
和QAbstractTableModel
類可能更好一些,由於這兩個類已經實現了不少通用函數。
Qt 內置了許多標準模型:
QStringListModel
:存儲簡單的字符串列表。QStandardItemModel
:能夠用於樹結構的存儲,提供了層次數據。QFileSystemModel
:本地系統的文件和目錄信息。QSqlQueryModel
、QSqlTableModel
和QSqlRelationalTableModel
:存取數據庫數據。若是這些標準模型不能知足須要,就必須繼承QAbstractItemModel
、QAbstractListModel
或者QAbstractTableModel
,建立本身的模型類。