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!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/12570430.html