PyQt5 QTableWidget行高自适应内容显示异常问题排查
PyQt5 QTableWidget嵌入自定义控件后行高自适应失效问题
基础环境
- Python 3.10
- PyQt5
项目文件说明
untitled.py:Qt Designer生成的对话框UI文件,内置6列规格的QTableWidget控件run_me.py:业务逻辑实现文件
复现场景
代码初始逻辑如下:
- 初始化表格后循环插入5行数据
- 每行前5列填充普通
QTableWidgetItem - 每行第6列通过
setCellWidget()方法嵌入自定义QGroupBox控件,控件内部包含单选按钮、输入框组件 - 代码中已完成垂直表头模式配置,同时调用
resizeRowsToContents()方法尝试实现行高自适应单元格内容
异常表现
- 所有行高显示错误,和嵌入的自定义控件实际高度不匹配
- 对照测试结果:修改
run_me.py的display_table_row方法,新增判断逻辑:行号counter>0时直接返回,仅渲染第一行的自定义单元格控件,此时表格前两行依然存在异常排版问题
根本原因
resizeRowsToContents()默认的行高计算逻辑,只会统计单元格内QTableWidgetItem的尺寸提示,不会自动计算通过setCellWidget()嵌入的子控件尺寸。
如果嵌入的自定义控件没有提前配置尺寸策略/最小尺寸,同时存在以下任意一种情况,就会触发排版错乱:
- 在嵌入子控件之前就调用了
resizeRowsToContents() - 嵌入控件后没有触发表格的尺寸重算逻辑
对照测试中仅渲染第一行控件依然出现排版异常,是因为跳过后续行控件渲染后,表格行高还是取初始化默认值,第一行嵌入控件后没有主动触发行高重算,自然不会自动适配控件高度。
修复方法
- 给嵌入第6列的自定义
QGroupBox配置尺寸策略:将垂直尺寸策略设为QSizePolicy.Minimum,同时给控件设置合理的最小高度 - 调整代码执行顺序:必须等所有行的
setCellWidget()调用完成后,再调用resizeRowsToContents(),不要在逐行插入内容的过程中调用自适应方法 - 若默认计算仍有偏差,可在所有控件嵌入完成后逐行手动校准行高,参考代码:
# 所有单元格内容、嵌入控件加载完成后执行 for row_idx in range(table_widget.rowCount()): # 第6列索引为5 embed_widget = table_widget.cellWidget(row_idx, 5) if embed_widget is not None: table_widget.setRowHeight(row_idx, embed_widget.sizeHint().height())
注意:逐行插入内容时不要提前触发行高计算,必须等对应行的所有嵌入控件完成渲染后再做尺寸计算,否则会拿到未渲染完成的错误尺寸值,导致行高设置不符合预期。
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

