PyQt學習隨筆:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可見行、邏輯行、可見列、邏輯列)相關概念及方法探究

一、概念

關於邏輯行logicalRow、列logicalColumn和可見行visualRow、列visualColumn的概念,在QTableWidget中沒有介紹,老猿查了比較多的資料,並經過驗證,最終才搞清楚相關概念。這裏有幾個關鍵點要說明一下:

  1. 邏輯行和邏輯列是指項本身在部件中存儲數據的行和列,是通過setItem將項與QTableWidget的邏輯行和列進行綁定的,也是通過QTableWidgetItem項方法row()和column()返回的值
  2. 界面可見行和列是指在部件上的行號和列號,從部件中第一行和第一列數據開始到指定邏輯行或邏輯列在部件內的序號,但隱藏行和列(這裏的隱藏包括通過表頭方法hideSection實現、數據在視口外、在可以手工調整行和列大小時將其大小調整到最小不可見)也必須參與在內。這個地方是個坑,說是可見行和可見列,但實際上隱藏未展現的和在視口外的數據都是參與行號和列號的計數
  3. 僅當部件中的行或列通過表頭的moveSection交換了行或列數據所在的位置時纔出現邏輯行列和可見行列不一致的情況

二、邏輯行相關方法

QTableWidget中可以根據項實例去獲取項的邏輯行和列位置,調用方法如下:

  • int column( QTableWidgetItem item)
  • int row( QTableWidgetItem item)

如果對應項在QTableWidget表格部件中不存在,則返回-1。

三、可見行和列相關方法

3.1、相關方法

要獲取表格部件中的可見行號和列號,調用方法:

  • int visualColumn(int logicalColumn)
  • int visualRow(int logicalRow)

3.2、案例

3.2.1、 案例說明

本案例在QTableWidget部件中顯示4行3列數據,根據數據的邏輯行號和列號顯示錶頭,如第一行顯示"行1",第一列顯示"列1",對應項存儲的數據爲“(行號-1,列號-1)”,“行號-1”、“列號-1”就是項的邏輯行號和列號,因爲計數是從0開始。
爲了顯示邏輯數據和可見數據的差別,案例中將第一行數據(行號爲0)進行隱藏,同時將第4行數據移動到了第3行。
爲了觀察數據,實現了項被點擊時輸出相關邏輯行、列和可見行和列以及項存儲的數據。

3.2.2、 項初始化initItems()方法代碼

    def initItems(self):
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3  )
        width = self.tableWidget.viewport().width() - 20

        for row in range(4):
            for col in range(3):
                item = QtWidgets.QTableWidgetItem(f"({row},{col})" )
                self.tableWidget.setItem(row,col,item)

        self.tableWidget.setVerticalHeaderLabels(['行1','行2','行3','行4'])
        self.tableWidget.setHorizontalHeaderLabels(['列1','列2','列3'])
        self.tableWidget.verticalHeader().moveSection(3,2) #將第4行移動到第3行
        self.tableWidget.verticalHeader().hideSection(0) #隱藏第一行

3.2.3、 項點擊槽方法代碼

    def cellClicked( self,rowid,  column):
        r = self.tableWidget.visualRow(rowid)
        c = self.tableWidget.visualColumn(column)
        item = self.tableWidget.currentItem()
        print(f"點擊了部件項,對應項的邏輯行和列爲:({rowid},{column}),可見行和列爲:({r},{c}),存儲數據爲:{item.text()}")

3.2.4. 運行截圖

在這裏插入圖片描述
從上述截圖可以看到,邏輯的第一行數據不可見,第三行和第四行數據交換了位置。

3.2.5、點擊項(1,0)輸出信息

在界面上點擊可見的第一行和第一列數據(對應數據爲“(1,0)”)輸出信息

點擊了部件項,對應項的邏輯行和列爲:(1,0),可見行和列爲:(1,0),存儲數據爲:(1,0)

由於隱藏的行也參與可見行號的計算,因此該項的邏輯行和可見行相同。

3.2.6、點擊項(3,1)輸出信息

在界面上點擊可見的第二行和第二列數據(對應數據爲“(3,1)”)輸出信息:

點擊了部件項,對應項的邏輯行和列爲:(3,1),可見行和列爲:(2,1),存儲數據爲:(3,1)

由於第二行數據實際對應的邏輯行是3(從0計數),可見行(含隱藏行)是2(也是從0計數),所以邏輯行和可見行數據不同

3.2.7. 點擊項(2,2)輸出信息

在界面上點擊可見的第三行和第三列數據(對應數據爲“(2,2)”)輸出信息:

點擊了部件項,對應項的邏輯行和列爲:(2,2),可見行和列爲:(3,2),存儲數據爲:(2,2)

四、小結

  1. 表格部件QTableWidget的項設置方法(setItem)所使用的行和列是項的邏輯行號和列號,表示數據在表格部件的存儲位置,表格部件中絕大多數方法所使用的行和列都是邏輯行和列。
  2. 僅當表格部件的表頭使用moveSection方法纔會導致表格部件的邏輯行列號可能和可見行列號不一致,行和列的隱藏以及超出視口都不會導致邏輯行列號可能和可見行列號不一致;
  3. 由於隱藏數據也在可見行列中計數,因此這兒的可見行列其實是不準確的,visualColumn和visualRow這兩個方法在使用上需要注意。

老猿Python,跟老猿學Python!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章