一、引言
QStandardItemModel有兩種構造方法:
- QStandardItemModel(QObject parent = None):直接創建一個模型實例,數據未進行初始化,可以通過setItem將QStandardItem的實例對象添加到模型中作為項。
- QStandardItemModel(int rows, int columns, QObject parent = None):直接創建一個模型實例,包含有rows行columns列的空項。這些項可以通過model的index方法獲取后,通過QModelIndex的setData方法進行數據修改。當模型中存儲實際數據少於指定的行或列時,多出部分顯示空數據。
第一種方法因為項是逐項添加,並且在添加過程中構造了QStandardItem項,這個好理解。第二種方法直接指定行數和列數,是否就自動生成項了呢?我們來做個驗證。
二、驗證QStandardItemModel(int rows, int columns, QObject parent = None)是否存在項
2.1、驗證步驟
2.1.1、創建指定行數和列數的QStandardItemModel模型並與視圖關聯
在視圖的構造方法中添加創建模型的代碼,示例語句:
self.model = QStandardItemModel(10, 3)
self.tableView.setModel(self.model)
此時運行代碼,界面初始如下:
2.1.2、在界面視圖創建一個鼠標雙擊的信號和槽的連接
在Designer中進入信號編輯界面創建信號和槽連接,如圖:
2.1.3、在界面派生類中實現槽方法
為了觀察相關項的情況,在槽方法中輸出相關觀察數據,示例代碼:
def doubleClickView(self,index):
row,col = index.row(),index.column()
print(f"doubleClickView index info:\nindex={index},row,col={row},{col}")
self.showItemInf(row,col)
上述代碼中index為鼠標雙擊信號傳遞過來的QModelIndex的項索引,指向Model中具體點擊對應的項,該索引中包含項所在的行和列以及父節點等信息。方法showItemInf展示項相關的信息。具體實現代碼如下:
def showItemInf(self,row,col):
item = self.model.item(row, col) #調用model的item方法獲取項
if item:
itemData = item.data() #獲取項對應的文本
itemIndex = item.index() #獲取項對應的索引
else:
itemData = None
itemIndex = None
print(f"item={item},itemData={itemData},itemIndex={itemIndex}")
index = self.model.index(row,col) #調用model的index方法獲取行和列對應項的索引
if index:indexData = index.data() #獲取索引對應項的文本
else:indexData = None
print(f"index={index},indexData={indexData}")
2.1.4、運行代碼,輸出相關信息
運行后,鼠標雙擊視圖中的項,如雙擊第1行第1列的項,上述代碼輸出如下信息:
doubleClickView index info:
index=<PyQt5.QtCore.QModelIndex object at 0x0000000003DB57B8>,row,col=0,0
item=None,itemData=None,itemIndex=None
index=<PyQt5.QtCore.QModelIndex object at 0x0000000003E5D128>,indexData=None
從上述輸出信息可以得出如下結論:
- 鼠標雙擊傳遞的QModelIndex參數與通過行和列獲取的QModelIndex實例不是同一個對象,但他們指向的數據相同
- 通過模型的item方法按指定行和列獲取數據項,返回結果為None,即模型使用帶行和列的參數創建后,實際上沒有對應的項
- 雖然沒有項,但模型索引並不為None,老猿認為這表明模型索引只是一個指向model中對應數據位置的索引,並不指向真正存儲的數據,但應該在模型索引中包含指向對應項數據的信息,用於獲取對應數據