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

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_())

解决方案说明

  1. 添加开关控件:新增QCheckBox作为页码显示的开关,默认开启,用户可自主切换。
  2. 自定义打印绘制逻辑:不再直接调用document.print_(),改用QPainter手动绘制每一页内容,完全掌控渲染流程,解决原代码中设置页面大小导致的空白问题。
  3. 页面布局优化:调整内容区域边距,为页码预留底部空间,避免内容与页码重叠。
  4. 正确分页处理:通过文档布局documentLayout()获取准确的分页信息,确保每一页内容都能正确渲染。

内容的提问来源于stack exchange,提问作者Cristian Felipe Espitia Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:39:53