QTableWidget如何调整行列尺寸适配单元格内的QWidget大小
QTableWidget行高适配单元格嵌入控件解决方案
问题根源:Qt 原生的resizeRowsToContents()、resizeColumnToContents()方法默认仅计算单元格内QTableWidgetItem的文本尺寸,不会统计通过setCellWidget()嵌入的自定义控件大小,因此单行文本行的行高仅按文本高度计算,会导致嵌入的QWidget被截断。
方案1:手动遍历设置行高(无需修改原有类结构,适合临时需求)
在你原有代码的resizeRowsToContents()调用之后,添加以下代码即可完成适配:
# 逐行计算适配高度 for row in range(self.rowCount()): # 先取文本计算出的默认行高 current_max_height = self.rowHeight(row) # 遍历该行所有列,检查是否存在嵌入控件 for col in range(self.columnCount()): cell_widget = self.cellWidget(row, col) if cell_widget: # 取嵌入控件的推荐高度作为参考 widget_height = cell_widget.sizeHint().height() if widget_height > current_max_height: current_max_height = widget_height # 用计算出的最大高度设置行高 self.setRowHeight(row, current_max_height)
方案2:重写QTableWidget尺寸计算方法(后续自动适配,适合高频修改场景)
如果后续会频繁更新单元格内容、增删嵌入控件,建议直接重写sizeHintForRow方法,之后调用原生的resizeRowsToContents()就会自动适配控件尺寸:
# 自定义支持嵌入控件适配的QTableWidget类 class AdaptiveTableWidget(QTableWidget): def sizeHintForRow(self, row: int) -> int: # 先获取原生方法计算的文本适配高度 base_height = super().sizeHintForRow(row) max_height = base_height # 遍历该行所有列的嵌入控件 for col in range(self.columnCount()): widget = self.cellWidget(row, col) if widget: widget_height = widget.sizeHint().height() if widget_height > max_height: max_height = widget_height return max_height
使用时把你原来的Window类的父类从QTableWidget改为AdaptiveTableWidget即可,不需要额外添加手动计算代码。
扩展说明
如果需要同时适配列宽,按照相同逻辑,取控件的sizeHint().width()和原有列宽的最大值设置即可;如果嵌入控件的布局设置了非零边距,可以在计算高度时额外加上对应的边距值,避免控件边缘被裁剪。
内容的提问来源于stack exchange,提问作者John1985
相关产品推荐
相关产品推荐

