PyQt(Python+Qt)學習隨筆:QStandardItemModel指定行和列創建模型中的項以及索引


一、引言

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中對應數據位置的索引,並不指向真正存儲的數據,但應該在模型索引中包含指向對應項數據的信息,用於獲取對應數據

老猿Python,跟老猿學Python!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM