一、QStringListModel介紹
QStringListModel是Qt提供的一個已經實現QAbstractItemModel相關接口的Model,適合於展示一系列字符串的簡單視圖如QListView對象和QComboBox對象。
QStringListModel提供了所有可編輯模型的標准函數,將字符串列表中的數據存儲為一個一列多行的模型。
使用index(int row, int column = 0, QModelIndex parent = QModelIndex())函數獲取與項對應的模型索引,使用flags(QModelIndex index)獲取項標志;使用data()函數讀取項數據,並使用setData()寫入項數據,使用rowCount()函數訪問模型數據的行數。
該模型可以用現有的字符串列表來構造,或者可以用setStringList()函數來設置字符串。字符串也可以用insertRows()函數以通常的方式插入,並用removeRows()刪除。字符串列表的內容可以使用stringList()函數檢索。
二、使用QStringListModel作為QListView的Model
使用QStringListModel作為QListView的Model的方法非常簡單,先創建QStringListModel實例對象,如果數據未存儲到Model中則將數據存儲到Model,然后再將QListView對象的Model設置為剛創建的Model實例。步驟如下:
2.1、 創建QStringListModel實例對象
實例對象創建有兩種方法:
- 創建無數據的Model
語法為:QStringListModel(QObject parent = None) - 創建Model同時初始化數據
語法為:QStringListModel(strings,QObject parent = None)
其中strings為要展示的字符串列表數據。
以上兩種方法的實例代碼:
self.model1 = QStringListModel()
strList = ["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"]
self.model2 = QStringListModel(strList)
只是以上方法創建model后,model1中無數據,而model2中有數據
2.2、初始化model中的數據
如果創建的model中無數據,可以通過幾種方法初始化model中的數據:
- 使用setStringList(str)方法完成初始化,示例代碼:
self.model1.setStringList(["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"])
- 使用insertRows()、index()、setData()方法組合實現
insertRows是在model中插入空的數據記錄,只是占據了數據位置,但沒有實際的數據,需要通過setData來生成實際存儲的數據。這種組合方法沒有多大實際價值,具體方法的參數及含義在此不進行詳細介紹,請參考如下示例代碼:
self.model = QStringListModel()
self.model.insertRows(0,3)
for i in range(4):
index = self.model.index(i-1)
self.model.setData(index,f"item{i}")
- 使用視圖的setModel(model)方法將model和view建立連接
示例代碼:
self.listView.setModel(self.model)
2.3、示例代碼及運行截圖
本示例代碼使用先創建對象再使用setStringList方法初始化數據:
def initStringListModel(self):
strList = ["item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"]
self.model = QStringListModel()
self.model.setStringList(strList )
self.listView.setModel(self.model)
運行截圖: