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
- 判斷項是否設置了sizeHint,如果沒有設置則按項的內容計算列寬,確保所有項的內容在一行上完整展示
- 如果項設置了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
- 判斷項是否設置了sizeHint,如果沒有設置則按項的內容計算項高,確保項的內容在豎直方向沒有遮蓋
- 如果項設置了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采用了其他方式標記是否進行過設置。