在QTableWidget對項的操作支持選中多個項的情況下,可以通過方法selectedRanges返回選中矩形的列表,通過方法setRangeSelected將指定矩形範圍的項選中或去選中。相關方法調用語法如下:
- list[QTableWidgetSelectionRange] selectedRanges()
- setRangeSelected( QTableWidgetSelectionRange range, bool select)
注:
- QTableWidgetSelectionRange描述一個基於邏輯項位置連續的矩形範圍,其矩形範圍的左上角座標爲該範圍內左上角邏輯項的邏輯行號和列號,右下角爲右下角邏輯項的邏輯行號和列號。注意這裏是指邏輯項而不是可見項
- 由於選中的項可能不連續,因此selectedRanges返回的可能是多個QTableWidgetSelectionRange矩形的列表,每個矩形內是一個連續的選中範圍
- 關於邏輯項請參考《PyQt學習隨筆:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可見行、邏輯行、可見列、邏輯列)相關概念及方法探究》
案例:
爲了說明矩形內的項是邏輯項連續,我們來看一個案例:
上圖中的行3和行4通過如下語句交互了可見位置,同時設定選擇範圍爲(1,1)->(2,2):
self.tableWidget.verticalHeader().moveSection(3,2) #將第4行移動到第3行
rect = QtWidgets.QTableWidgetSelectionRange(1, 1, 2, 2) #定義矩形範圍爲邏輯行爲1,列爲1(即第二行第二列)到第3邏輯行3邏輯列的項
self.tableWidget.setRangeSelected(rect, True)
通過範圍選擇後,選中的範圍從界面上看卻不是連續的,但實際上邏輯項是連續的。
我們通過如下語句輸出選中範圍:
def showSelectRect(self):
selectRect = self.tableWidget.selectedRanges()
for r in selectRect:
print(f'({r.topRow()},{r.leftColumn()})-->({r.bottomRow()},{r.rightColumn()})')
針對上圖輸出的信息如下:
(1,1)-->(2,2)
如果針對上圖通過鼠標改變選中範圍,如圖:
界面上看起來可見項是連續的,輸出矩形選中範圍結果如下:
(1,1)-->(1,2)
(3,1)-->(3,2)
顯示爲兩個矩形,不是連續的範圍。