PyQt5预览页码控制:移除页码后内容不显示及开关控件实现求助
问题:实现QPrintPreviewWidget页码显示开关并解决预览空白问题
尝试移除QPrintPreviewWidget的页面预览页码,但设置文档页面大小后预览内容无法显示。需要实现一个开关控件,让用户自主选择是否为页面添加页码。
相关代码
def auto_num_checked(self): value = self.auto_check_box.checkState() self.auto_check_box.setChecked(value) def prin_preview(self): """ This funciton create a window that allows to the customer customize his page size :return: QPrinter """ self.preview_page_dialog = QPrintPreviewDialog() self.preview_page_dialog.setWindowIcon(QIcon("Icons/Main_logo.png")) self.preview_page_dialog.paintRequested.connect(self.prepare_the_document_to_visualize) self.preview_page_dialog.exec_() def prepare_the_document_to_visualize(self,printer: QPrinter): self.printer = printer self.printer.setDocName(f"{self.windowTitle()} - " + str(self.current_tab_info.name)) self.document = self.current_plain_text_widget.document() self.printer.setPageSize(QPageSize(QPageSize.Letter)) self.document.setPageSize(QtCore.QSizeF(self.printer.width(), self.printer.height())) self.document.print_(self.printer) def print_document(self): self.printer = QPrinter() dialog_printer = QPrintDialog(self.printer) if dialog_printer.exec_(): self.printer.setDocName(f"{self.windowTitle()} - " + str(self.current_tab_info.name)) self.document = self.current_plain_text_widget.document() self.document.print_(self.printer)
最小可复现示例(已修复并添加开关功能)
import sys """ PyQT Version: PyQt 5 Operative system: Windows 11 IDE ------- PyCharm 2023.3.5 (Community Edition) Build #PC-233.15026.15, built on March 21, 2024 Runtime version: 17.0.10+1-b1087.23 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11.0 GC: G1 Young Generation, G1 Old Generation Memory: 4062M Cores: 16 Registry: ide.experimental.ui=true Non-Bundled Plugins: com.jetbrains.space (233.15026.16) ------ """ from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QPlainTextEdit, QCheckBox from PyQt5.QtPrintSupport import QPrintPreviewDialog, QPrinter from PyQt5.QtCore import QSizeF, Qt from PyQt5.QtGui import QPageSize, QPainter, QTextCursor class MainWidget(QWidget): def __init__(self, parent = None): super().__init__(parent) self.text_edit = QPlainTextEdit(self) self.preview_button = QPushButton(self, text ="&预览") self.show_page_num_check = QCheckBox(self, text="显示页码") self.show_page_num_check.setChecked(True) # 默认开启页码显示 self.preview_button.clicked.connect(self.preview_clicked) # 控件布局 self.text_edit.setGeometry(10,10, 300,200) self.show_page_num_check.setGeometry(10,220, 100,30) self.preview_button.setGeometry(120,220, 100,30) def preview_clicked(self): dialog_privew = QPrintPreviewDialog() dialog_privew.paintRequested.connect(self.display_paint_view) dialog_privew.exec_() def display_paint_view(self, printer): # 配置打印机参数 printer.setDocName(f"{self.windowTitle()} - 预览") printer.setPageSize(QPageSize(QPageSize.Letter)) doc = self.text_edit.document() doc.setPageSize(QSizeF(printer.pageRect(QPrinter.PageSizeUnit.DevicePixel).size())) painter = QPainter(printer) page_rect = printer.pageRect(QPrinter.PageSizeUnit.DevicePixel) content_rect = page_rect.adjusted(20, 20, -20, -40) # 为页码预留底部空间 # 获取文档总页数 layout = doc.documentLayout() total_pages = layout.pageCount() # 逐页绘制内容与页码 for page in range(total_pages): if page > 0: printer.newPage() # 绘制文档主体内容 layout.drawPage(painter, page, content_rect) # 根据开关状态决定是否绘制页码 if self.show_page_num_check.isChecked(): painter.drawText(page_rect, Qt.AlignBottom | Qt.AlignHCenter, f"第 {page+1} 页 / 共 {total_pages} 页") painter.end() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWidget() window.resize(350, 280) window.show() sys.exit(app.exec_())
解决方案说明
- 添加开关控件:新增
QCheckBox作为页码显示的开关,默认开启,用户可自主切换。 - 自定义打印绘制逻辑:不再直接调用
document.print_(),改用QPainter手动绘制每一页内容,完全掌控渲染流程,解决原代码中设置页面大小导致的空白问题。 - 页面布局优化:调整内容区域边距,为页码预留底部空间,避免内容与页码重叠。
- 正确分页处理:通过文档布局
documentLayout()获取准确的分页信息,确保每一页内容都能正确渲染。
内容的提问来源于stack exchange,提问作者Cristian Felipe Espitia Garcia
相关产品推荐
相关产品推荐

