PyQt5 QTableView使用HTML渲染时行高控制问题咨询
问题解答
问题1:sizeHint的option参数构造逻辑
- 生成模块:
sizeHint接收的QStyleOptionViewItem类型option参数由QTableView(所属的项视图类) 在内置布局计算逻辑中构造生成。 - 赋值逻辑:默认情况下,
option.rect.width取对应列的默认大小提示值,而非你手动设置的固定列宽。你代码中先调用resizeRowsToContents计算行高、后调用setColumnWidth设置列宽,计算行高时列宽还未更新,就会出现sizeHint拿到的宽度远小于实际单元格宽度的问题。 - 自定义修改:支持自定义修改,你在sizeHint内修改option属性的写法是合法的,更合理的写法是不要硬编码列宽,直接从表格视图读取当前列的真实宽度:
# 替换sizeHint里的option.rect.setWidth(400)为下面的代码,适配任意列宽 real_col_width = self.parent().columnWidth(index.column()) option.rect.setWidth(real_col_width)
问题2:短文本单元格底部多余空白的解决方案
产生原因
- 你的垂直表头配置代码写错了:原代码写的是
v_header.sectionResizeMode(QtWidgets.QHeaderView.Fixed),漏了前缀set,配置没有生效,导致垂直表头保留了默认的最小行高限制。 - Qt的
QStyledItemDelegate默认会给单元格增加垂直内边距,你用QTextDocument计算出的高度没有扣除这部分默认边距。 QTextDocument默认的行高会比字体实际渲染高度多出1-2px的leading间距。
修复方案
- 修正垂直表头的配置代码:
# 原错误写法 # v_header.sectionResizeMode(QtWidgets.QHeaderView.Fixed) # 改为 v_header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) v_header.setMinimumSectionSize(0) - 在
sizeHint返回高度时,扣除多余的间距:
计算完doc_height_int后,减去2-3px的默认边距即可,你可以根据实际显示效果微调:doc_height_int = int(doc.size().height()) # 扣除多余空白,同时保证行高不小于单行字体的实际高度 doc_height_int = max(doc_height_int - 2, QtGui.QFontMetrics(option.font).height()) return QtCore.QSize(int(doc.idealWidth()), doc_height_int) - 调整行高计算的时机:把
resizeRowsToContents调用挪到设置列宽之后,保证计算行高时用的是最终的列宽:self.table_view.setColumnWidth(0, 400) self.table_view.setColumnWidth(1, 400) # 列宽设置完成后再计算行高 self.table_view.resizeRowsToContents()
内容的提问来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

