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
相关产品推荐
相关产品推荐

