You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5打印QTableWidget出现排版异常问题求助

PyQt5打印QTableWidget为PDF时的排版故障

使用PyQt5将QTableWidget内容打印为PDF时出现排版错误:表格最后一行的所有内容被错误插入到倒数第二行的最后一列中,尝试多种方案均无法解决该问题。

相关代码如下:

document = QTextDocument()
cursor = QTextCursor(document)
table = cursor.insertTable(
    self.students_reports_table.rowCount(), self.students_reports_table.columnCount())
for col in range(table.columns()):
    cursor.insertText(self.students_reports_table.horizontalHeaderItem(col).text())
    cursor.movePosition(QTextCursor.NextCell)


for row in range(table.rows()):
    for col in range(table.columns()):
        cursor.insertText(self.students_reports_table.item(row, col).text())
        cursor.movePosition(QTextCursor.NextCell)
document.print_(printer)

故障表现:表格最后一行内容未正常占据独立行,而是全部挤入倒数第二行的最后一列单元格内,导致表格结构混乱。

解决方案

问题根源在于光标移动逻辑:当插入完最后一个单元格内容后,调用NextCell会让光标试图移动到不存在的下一个单元格,进而触发QTextDocument的异常排版调整。

可以通过避免在最后一个单元格后执行光标移动来修复,修改后的代码如下:

document = QTextDocument()
cursor = QTextCursor(document)
table = cursor.insertTable(
    self.students_reports_table.rowCount(), self.students_reports_table.columnCount())

# 写入表头
for col in range(table.columns()):
    cursor.insertText(self.students_reports_table.horizontalHeaderItem(col).text())
    # 最后一列不执行光标移动
    if col != table.columns() - 1:
        cursor.movePosition(QTextCursor.NextCell)

# 写入表格内容
for row in range(table.rows()):
    for col in range(table.columns()):
        cursor.insertText(self.students_reports_table.item(row, col).text())
        # 最后一个单元格不执行光标移动
        if not (row == table.rows() - 1 and col == table.columns() - 1):
            cursor.movePosition(QTextCursor.NextCell)

document.print_(printer)

或者也可以直接通过单元格对象定位光标,这种方式更直观且不易出错:

document = QTextDocument()
cursor = QTextCursor(document)
row_count = self.students_reports_table.rowCount()
col_count = self.students_reports_table.columnCount()

# 插入表格
table = cursor.insertTable(row_count, col_count)

# 写入表头
for col in range(col_count):
    cell = table.cellAt(0, col)
    cell_cursor = cell.firstCursorPosition()
    cell_cursor.insertText(self.students_reports_table.horizontalHeaderItem(col).text())

# 写入表格内容
for row in range(row_count):
    for col in range(col_count):
        cell = table.cellAt(row, col)
        cell_cursor = cell.firstCursorPosition()
        item = self.students_reports_table.item(row, col)
        if item:
            cell_cursor.insertText(item.text())

document.print_(printer)

内容的提问来源于stack exchange,提问作者Muhammad Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:48:52