PyQt6中打印嵌套HTML表格时子表格无法填充父单元格问题
解决PyQt6中打印嵌套表格宽度无法填满父单元格的问题
你遇到的问题是主表格内的嵌套子表格无法填充父单元格的100%宽度,这是因为QTextDocument的HTML渲染对嵌套表格的宽度计算默认采用内容优先逻辑,即使设置了width:100%也可能不生效。可以通过调整CSS样式解决:
修改方案
在原有样式表中添加针对嵌套表格的样式规则,强制嵌套表格占满父单元格宽度,并使用固定布局模式:
style_sheet = ''' table { border-collapse: collapse; width: 100%; } /* 新增:强制嵌套表格占满父单元格宽度 */ td > table { width: 100%; table-layout: fixed; } th { background-color: lightblue; border: 1px solid gray; height: 1em; } td { border: 1px solid gray; padding: 0; vertical-align: top; } '''
修改后的完整代码
import sys from PyQt6 import QtWidgets, QtPrintSupport from PyQt6.QtGui import QTextDocument class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.table_widget = QtWidgets.QTableWidget() self.button = QtWidgets.QPushButton('Print TableWidget') self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.table_widget) self.layout.addWidget(self.button) self.button.clicked.connect(self.print_table) def print_table(self): html_table = ''' <table cellpadding="0"> <tr><th>header1</th><th>header2</th><th>header3</th></tr> <tr> <td>data1</td> <td>data2</td> <td><table> <tr> <th>header1</th><th>header2</th><th>header3</th> </tr> <tr> <td>data3</td><td>data3</td><td>data3</td> </tr> </table></td> </tr> <tr> <td>data1</td> <td>data2</td> <td><table> <tr> <th>hr1</th><th>hr2</th><th>hr3</th><th>hr4</th> </tr> <tr> <td>d3</td><td>d3</td><td>d3</td><td>d3</td> </tr> <tr> <td>d3</td><td>d3</td><td>d3</td><td>d3</td> </tr> </table></td> </tr> </table> ''' style_sheet = ''' table { border-collapse: collapse; width: 100%; } td > table { width: 100%; table-layout: fixed; } th { background-color: lightblue; border: 1px solid gray; height: 1em; } td { border: 1px solid gray; padding: 0; vertical-align: top; } ''' text_doc = QTextDocument() text_doc.setDefaultStyleSheet(style_sheet) text_doc.setHtml(html_table) prev_dialog = QtPrintSupport.QPrintPreviewDialog() prev_dialog.paintRequested.connect(text_doc.print) prev_dialog.exec() if __name__ == '__main__': app = QtWidgets.QApplication([]) widget = MyWidget() widget.resize(640,480) widget.show() sys.exit(app.exec())
原理说明
table-layout: fixed:强制表格采用固定布局模式,表格宽度由父容器决定,而非根据内容自动收缩,确保嵌套表格填满父单元格的全部宽度。td > table:通过子选择器精准定位主表格单元格内的嵌套表格,避免影响主表格本身的布局。
内容的提问来源于stack exchange,提问作者SergFSM
相关产品推荐
相关产品推荐

