PyQt(Python+Qt)學習隨筆:QTableWidget表格部件中行高和列寬的計算方式

QTableWidget表格部件中行高和列寬的計算在Qt提供的資料中內容介紹比較泛,細節說得不清楚,爲此老猿花了整整2天時間進行反覆摸索,最終將行高和列寬的計算方法研究明白了,在此整理

一、對列寬的計算:

對QTableWidget表格部件的每個項的列寬計算方式如下:

1.1、獲取表頭的sectionResizeMode屬性

通過QTableWidget.horizontalHeader()方法取部件的水平表頭,通過表頭的方法取表頭的sectionResizeMode屬性。

關於sectionResizeMode請參考《PyQt(Python+Qt)學習隨筆:QHeaderView.ResizeMode取值及含義》。

示例代碼:
 sectionResizeMode = self.tableWidget.horizontalHeader().sectionResizeMode()
1.2、 根據sectionResizeMode不同採用不同方法計算項的列寬
1.2.1、sectionResizeMode=QHeaderView.Stretch

各列平分部件視口的寬度,數據寬度超過列寬時自動換行顯示或縮略顯示(即只顯示部分),但當平分後的寬度小於水平表頭的minimumSectionSize時,則寬度設置爲minimumSectionSize大小,展示不下的內容會進入視口之外,需要水平滾動纔可見。

minimumSectionSize的獲取方法示例代碼:
minimumSectionSize=self.tableWidget.horizontalHeader().minimumSectionSize()
1.2.2、sectionResizeMode=QHeaderView.Fixed

各列固定列寬爲水平表頭的defaultSectionSize大小,無法手工調整大小,可以通過編程調用 resizeSection()調整大小,數據超過列寬時將縮略顯示。

1.2.3、sectionResizeMode=QHeaderView.Interactive

列寬缺省大小爲水平表頭的defaultSectionSize大小,可以通過手工或編程調用 resizeSection()調整大小,數據超過列寬時將縮略顯示。

1.2.4、sectionResizeMode=QHeaderView.ResizeToContents
  1. 判斷項是否設置了sizeHint,如果沒有設置則按項的內容計算列寬,確保所有項的內容在一行上完整展示
  2. 如果項設置了sizeHint,則取sizeHint的寬和水平表頭horizontalHeader().minimumSectionSize()兩者之間最大值作爲項的列寬。
1.3、計算同列各項(含表頭項)的列寬後,取整列所有項列寬的最大值作爲該列(該節)的列寬。

二、對行高的計算:

對QTableWidget表格部件的每個項的行高計算方式如下:

2.1、獲取表頭的sectionResizeMode屬性

通過QTableWidget.horizontalHeader()方法取部件的水平表頭,通過表頭的方法取表頭的sectionResizeMode屬性,

示例代碼:
sectionResizeMode = self.tableWidget.verticalHeader().sectionResizeMode()
2.2、 根據sectionResizeMode計算項的列寬
2.2.1、sectionResizeMode=QHeaderView.Stretch

各行平分部件視口的高度,當平分高度小於豎直表頭的minimumSectionSize()值時,項的高度最小爲minimumSectionSize()值,當項高小於實際數據高度時,數據被遮蔽部分可能導致無法識別。當數據超出視口的高度時,需要滾動才能查看未展示數據。

2.2.2、sectionResizeMode=QHeaderView.Fixed

各行固定行高爲豎直表頭的defaultSectionSize大小,無法手工調整大小,可以通過編程調用 resizeSection()調整大小。

2.2.3、sectionResizeMode=QHeaderView.Interactive

行高缺省大小爲豎直表頭的defaultSectionSize大小,可以通過手工或編程調用 resizeSection()調整大小。

2.2.4、sectionResizeMode=QHeaderView.ResizeToContents
  1. 判斷項是否設置了sizeHint,如果沒有設置則按項的內容計算項高,確保項的內容在豎直方向沒有遮蓋
  2. 如果項設置了sizeHint,則取sizeHint的高和豎直表頭verticalHeader().minimumSectionSize()兩者之間最大值作爲項的高寬。
2.3、計算同行各項的項高後,取整行所有項的項高最大值作爲該行的行高。

特別說明:

上述介紹中介紹的是否設置了sizeHint,是指顯示調用了項的setSizeHint(QSize size)方法,只要調用了該方法,無論參數size設置爲多少,包括QSize(0,0)、QSize(-1,-1)都認爲是設置了sizeHint。而如果項沒有調用setSizeHint方法去設置sizeHint,此時調用項的sizeHint()方法返回的是QSize(-1,-1),與調用設置爲QSize(-1,-1)時的sizeHint()返回值一樣無法區分,應該是Qt和PyQt採用了其他方式標記是否進行過設置。

老猿Python,跟老猿學Python!

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