36. 打印机

news/2025/1/24 21:01:32/文章来源:https://www.cnblogs.com/FlurryHeart/p/18690348

一、打印机

  应用程序一般都有打印功能,可以将重要内容打印成纸质资料。PySide6 支持打印操作,它可以识别系统中已经安装的打印机,驱动打印机进行工作,可以用与打印机有关的类直接打印,也可通过打印对话框进行打印,还可对打印的内容在打印前进行打印预览。与打印有关的类主要在 QtPrintSupport 模块中。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

二、打印机信息

  PySide6 提供识别打印机硬件的类 QPrinterInfo 和进行打印的类 QPrinter,将 QPrinter 作为 QPainter 的绘图设备,可以将图形、文字和图像等用打印机进行输出,保存到纸质介质上。

  打印机信息 QPrinterInfo 代表本机上可以使用的一台打印机,通过 QPrinterInfo 可以获取打印机的参数。用 QPrinterInfo 创建打印机信息实例对象的方法如下所示。

QPrinterInfo()
QPrinterInfo(printer:QPrinter)

  打印机信息 QPrinterInfo 的常用方法如下:

# 实例方法
isDefault() -> bool                                 # 获取是否是默认的打印机
isNull() -> bool                                    # 获取是否不含打印机信息
isRemote() -> bool                                  # 获取是否是远程网络打印机defaultColorMode() -> QPrinter.ColorMode            # 获取默认颜色模式
defaultDuplexMode() -> QPrinter.DuplexMode          # 获取默认双面打印模式defaultPageSize() -> QPrinter.PaperSize             # 获取默认纸张大小
minimumPhysicalPageSize() -> QSizeF                 # 获取支持的最小打印纸尺寸
maximumPhysicalPageSize() -> QSizeF                 # 获取支持的最大打印纸尺寸supportedColorModes() -> list[QPrinter.ColorMode]   # 获取支持的颜色模式
supportedDuplexModes() -> list[QPrinter.DuplexMode] # 获取支持的双面打印模式
supportedPageSizes() -> list[QPrinter.PaperSize]    # 获取支持的纸张大小
supportedResolutions() -> list[int]                 # 获取支持的分辨率
supportsCustomPageSizes() -> bool                   # 获取是否支持自定义纸张大小description() -> str                                # 获取打印机描述
location() -> str                                   # 获取打印机位置信息
makeAndModel() -> str                               # 获取打印机厂商和型号
printerName() -> str                                # 获取打印机名称
state() -> QPrinter.PrinterState                    # 获取打印机状态# 静态方法
static availablePrinterNames() -> list[str]         # 获取可用的打印机名称列表
static availablePrinters() -> list[QPrinter]        # 获取可用的打印机列表
static defaultPrinter() -> QPrinter                 # 获取默认打印机
static defaultPrinterName() -> str                  # 获取默认打印机名称
static printerInfo(printerName:str) -> QPrinterInfo # 根据打印机名称获取打印机

  用 defaultDuplexMode() 方法获取打印机默认的双面打印模式,返回值是 QPrinter.DuplexMode 的枚举值,可取值如下:

QPrinter.DuplexMode.DuplexNone              # 单面模式,对应值0
QPrinter.DuplexMode.DuplexAuto              # 用打印机的默认设置来决定是单面模式还是双面模式,对应值1
QPrinter.DuplexMode.DuplexLongSide          # 双面模式,打印第2面前沿纸张长边翻面,对应值2
QPrinter.DuplexMode.DuplexShortSide         # 双面模式,打印第2面前沿纸张短边翻面,对应值3

三、打印机

  QPrinter 表示打印出来的纸张,可以作为 QPainter 的绘图设备来使用。QPrinter 继承自 QPagedPaintDevice 和 QPaintDevice。用 QPrinter 创建打印机实例的方法如下所示:

QPrinter(mode:QPrinter.PrinterMode=QPrinter.ScreenResolution)
QPrinter(printer:QPrinterInfo,mode:QPrinter.PrinterMode=QPrinter.PrinterMode.ScreenResolution)

  其中参数 mode 设置打印模式,取值是 QPrinter.PrinterMode 的枚举值。

  打印机 QPrinter 的常用方法如下:

printerName() -> str                                                            # 获取打印机名称
setPrinterName(name:str) -> None                                                # 设置打印机名称outputFileName() -> str                                                         # 获取输出文件名称
setOutputFileName(name:str) -> None                                             # 设置输出文件名称outputFormat() -> OutputFormat                                                  # 获取打印到文件时的格式
setOutputFormat(format:OutputFormat) -> None                                    # 设置打印到文件时的格式fullPage() -> bool                                                              # 获取是否整页模式打印
setFullPage(arg__1:bool) -> None                                                # 设置是否整页模式打印copyCount() -> int                                                              # 获取打印份数
setCopyCount(count:int) -> None                                                 # 设置打印份数collateCopies() -> bool                                                         # 获取是否对照打印
setCollateCopies(collate:bool) -> None                                          # 设置是否对照打印fromPage() -> int                                                               # 获取打印页码范围起始页
toPage() -> int                                                                 # 获取打印页码范围结束页
setFromTo(fromPage:int, toPage:int) -> None                                     # 设置打印页码范围colorMode() -> ColorMode                                                        # 获取打印颜色模式
setColorMode(mode:ColorMode) -> None                                            # 设置打印颜色模式pageOrder() -> QPrinter.PageOrder                                               # 获取打印页面顺序
setPageOrder(order:QPrinter.PageOrder) -> None                                  # 设置打印页面顺序resolution() -> int                                                             # 获取打印精度
setResolution(arg__1:int) -> None                                               # 设置打印精度docName() -> str                                                                # 获取打印文档名称
setDocName(name:str) -> None                                                    # 设置打印文档名称duplex() -> QPrinter.Duplex                                                     # 获取双面模式
setDuplex(duplex:QPrinter.Duplex) -> None                                       # 设置双面模式fontEmbeddingEnabled() -> bool                                                  # 获取是否启用内置字体
setFontEmbeddingEnabled(enable:bool) -> None                                    # 设置是否启用内置字体paperSource() -> QPrinter.PaperSource                                           # 获取纸张来源
setPaperSource(arg__1:QPrinter.PaperSource) -> None                             # 设置纸张来源abort() -> bool                                                                 # 取消正在打印的文档
isValid() -> bool                                                               # 检查打印机是否有效
paperRect(arg__1:Unit) -> QRectF                                                # 获取打印纸大小
pageRect(arg__1:Unit) -> QRectF                                                 # 获取打印页面大小printRange() -> QPageLayout.PageRange                                           # 获取打印范围的模式
printerState() -> QPrinter.PrinterState                                         # 获取打印机状态setPdfVersion(version:QPdfWriter.PdfVersion) -> None                            # 设置PDF版本supportedResolutions() -> list[int]                                             # 获取支持的打印精度
supportsMultipleCopies() -> bool                                                # 检查是否支持多份打印# 继承父类的方法
pageLayout() -> QPageLayout                                                     # 获取打印页面布局# 继承父类的虚拟方法
setPageMargins(margins:QMarginsF, units:Unit=QPageLayout.Millimeter) -> bool    # 设置打印页边距
setPageOrientation(orientation:Orientation) -> bool                             # 设置打印方向
setPageRanges(ranges:QPageRanges) -> None                                       # 设置打印页码范围
setPageSize(pageSize:QPageSize) -> None                                         # 设置打印页面大小
setPageLayout(pageLayout:QPageLayout) -> bool                                   # 设置打印页面布局# 继承父类的抽象方法
abstract newPage() -> bool                                                      # 生成新页

  用 QPrinterInfo 的静态方法 availablePrinterNames() 可以获得本机已经安装的打印机名称列表,然后用 QPrinter 的setPrinterName(str) 方法将其中一台打印机设置成 QPrinter。

  用 setOutputFileName(str) 方法设置打印机将打印内容打印到文件中而不是纸质介质上,参数是文件名。如果不设置该内容或设置为空字符串,则将内容打印到纸张上;如果设置了扩展名是 PDF 的文件名,则将打印内容输出到 PDF 文档中;如果设置的扩展名不是 PDF,则将打印内容输出到按照 setOutputFormat(QPrinter.OutputFormat) 方法设置的文件格式的文件中,其中 QPrinter.OutputFormat 枚举值可取值如下:

QPrinter.OutputFormat.NativeFormat          # 本机定义格式,值是0
QPrinter.OutputFormat.PdfFormat             # PDF格式,值是1

  在打印完第一页后,需要用 newPage() 方法通知打印机弹出当前正在打印的纸张,继续进行下一页的打印,成功则返回 True;用 abort() 方法取消当前的打印,成功则返回 True。

  用 setFullPage(bool) 方法设置是否是整页模式打印。在 setFullPage(True) 时,QPainter 的坐标原点在可打印区的左上角,与纸张坐标系的原点重合,但由于页边距的限制,实际上不能在整张纸上打印;在 setFullPage(False) 时,QPainter 的坐标原点在打印区域的左上角。

  用 setPrintRange(range:QPrinter.PrintRange) 方法设置打印范围的模式,参数 range 可取值如下:

QPrinter.PrintRange.AllPages        # 打印所有页,值是0
QPrinter.PrintRange.Selection       # 打印选中的页,值是1
QPrinter.PrintRange.CurrentPage     # 打印当前页,值是3

  用 setPageOrientation(QPageLayout.Orientation) 方法设置打印方向,参数是 QPageLayout.Orientation 的枚举值,可取值如下:

QPageLayout.Orientation.Portrait        # 纵向,值是0
QPageLayout.Orientation.Landscape       # 横向,值是1

  用 setPageOrder(QPrinter.PageOrder) 方法设置打印顺序,参数是 QPrinter.PageOrder 的枚举值,可取值如下:

QPrinter.PageOrder.FirstPageFirst           # 正常顺序,值是0
QPrinter.PageOrder.LastPageFirst            # 反向顺序,值是1
import sys
from math import cos, pi, sinfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QPushButton, QLineEdit, QComboBox, QSpinBox, QCheckBox
from PySide6.QtWidgets import QFormLayout
from PySide6.QtPrintSupport import QPrinter, QPrinterInfo
from PySide6.QtGui import QPageLayout, QPageSize, QPainter, QPen
from PySide6.QtCore import QPointFclass MyWidget(QWidget):def __init__(self):super().__init__()self.comboBox = QComboBox()self.comboBox.currentTextChanged.connect(self.comboBox_currentTextChanged)self.spinBox_copies = QSpinBox()self.spinBox_copies.setRange(1, 100)self.checkBox = QCheckBox("输出到文件")self.checkBox.clicked.connect(self.checkBox_clicked)self.lineEdit_file = QLineEdit()self.lineEdit_file.setText("output.pdf")self.lineEdit_file.setEnabled(self.checkBox.isChecked())self.button_printer = QPushButton("打印")self.button_printer.clicked.connect(self.button_printer_clicked)formLayout = QFormLayout(self)formLayout.addRow("选择打印机", self.comboBox)formLayout.addRow("设置打印份数", self.spinBox_copies)formLayout.addRow(self.checkBox, self.lineEdit_file)formLayout.addRow(self.button_printer)printerName = QPrinterInfo.availablePrinterNames()self.comboBox.addItems(printerName)self.comboBox.setCurrentText(QPrinterInfo.defaultPrinterName())def comboBox_currentTextChanged(self, text):printInfo = QPrinterInfo.printerInfo(text)                              # 获取打印机信息   self.printer = QPrinter(printInfo)self.printer.setPageOrientation(QPageLayout.Orientation.Portrait)       # 设置页面方向为纵向self.printer.setFullPage(False)                                         # 设置整页打印self.printer.setPageSize(QPageSize.PageSizeId.A4)                       # 设置页面大小为A4self.printer.setColorMode(QPrinter.ColorMode.GrayScale)                 # 设置打印模式为灰度模式def checkBox_clicked(self, checked):self.lineEdit_file.setEnabled(checked)def button_printer_clicked(self):if self.checkBox.isChecked():self.printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)       # 设置输出格式为PDFself.printer.setOutputFileName(self.lineEdit_file.text())           # 设置输出到文件if self.printer.isValid():self.painter = QPainter()if self.painter.begin(self.printer):pen = QPen()pen.setWidth(5)                                             # 设置画笔宽度为5self.painter.setPen(pen)                                    # 设置画笔# 获取中心点坐标x = self.printer.paperRect(QPrinter.Unit.DevicePixel).width() / 2y = self.printer.paperRect(QPrinter.Unit.DevicePixel).height() / 2r = min(self.printer.pageRect(QPrinter.Unit.DevicePixel).width() / 2, self.printer.pageRect(QPrinter.Unit.DevicePixel).height() / 2)p1 = QPointF(r * cos(-90 * pi / 180) + x , r * sin(-90 * pi / 180) + y)p2 = QPointF(r * cos(-18 * pi / 180) + x , r * sin(-18 * pi / 180) + y)p3 = QPointF(r * cos(54 * pi / 180) + x , r * sin(54 * pi / 180) + y)p4 = QPointF(r * cos(126 * pi / 180) + x , r * sin(126 * pi / 180) + y)p5 = QPointF(r * cos(198 * pi / 180) + x , r * sin(198 * pi / 180) + y)page_copies = self.spinBox_copies.value()for i in range(1, page_copies + 1):self.painter.drawPolyline([p1, p3, p5, p2, p4, p1])print(f"正在提交第{i}页,共{page_copies}页")if i != page_copies:self.printer.newPage()self.painter.end()if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

四、控件界面打印

  如果要打印窗口或控件的界面,需要利用 QWidget 的 render() 函数,它可以把窗口或控件的指定区域打印到纸张或文件中。render() 函数的格式如下所示。

  其中:targetOffset 是指在纸张或文件中的偏移量;sourceRegion 是指窗口或控件的区域,如果不给出则取 rect() 的返回值;target 是指绘图设备,如 QPixmap;renderFlags 是枚举值 QWidget.RenderFlag 取值的组合,可取值如下:

QWidget.RenderFlag.DrawWindowBackground             # 打印背景
QWidget.RenderFlag.DrawChildren                     # 打印子控件
QWidget.RenderFlag.IgnoreMask                       # 忽略mask()函数

  能打印控件内容的控件和打印函数如下:

能打印控件内容的控件和打印函数

  这里,我们修改 button_printer_clicked() 函数就可以把整个窗口打印到纸上或文件中。

from PySide6.QtCore import QPoint, QPointFdef button_printer_clicked(self):if self.checkBox.isChecked():self.printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)       # 设置输出格式为PDFself.printer.setOutputFileName(self.lineEdit_file.text())           # 设置输出到文件if self.printer.isValid():self.painter = QPainter()if self.painter.begin(self.printer):page_copies = self.spinBox_copies.value()for i in range(1, page_copies + 1):self.render(self.painter, QPoint(200, 0))print(f"正在提交第{i}页,共{page_copies}页")if i != page_copies:self.printer.newPage()self.painter.end()

五、PDF文档生成器

  PySide6 可以将 QPainter 绘制的图形、文字和图像等转换成 PDF 文档。转换成 PDF 文档的类是 QPdfWriter,它继承自 QObject 和 QPagedPaintDevice。用 QPdfWriter 创建实例对象的方法如下所示。

QPdfWriter(filename:str)
QPdfWriter(device:QIODevice)

  PDF 文档生成器 QPdfWriter 的常用方法如下:

# 实例方法
creator() -> str                                                                # 获取创建者
setCreator(creator:str) -> None                                                 # 设置创建者resolution() -> int                                                             # 设置分辨率
setResolution(resolution:int) : None                                            # 设置分辨率title() -> str                                                                  # 获取PDF文档标题
setTitle(title:str) -> None                                                     # 设置PDF文档标题setPdfVersion(version:PdfVersion) -> None                                       # 设置PDF版本# 继承父类的实例方法
pageRanges() -> QPageRanges                                                     # 获取页码范围# 继承父类的虚拟方法
abstract newPage() -> bool                                                      # 生成新页setPageLayout(pageLayout:QPageLayout) -> bool                                   # 设置页面布局
setPageMargins(margins:QMarginsF, units:Unit=QPageLayout.Millimeter) -> bool    # 设置页边距
setPageOrientation(orientation:Qt.Orientation) -> bool                          # 设置页面方向
setPageRanges(ranges:QPageRanges) -> bool                                       # 设置页码范围
setPageSize(pageSize:QPageSize) -> bool                                         # 设置页面大小
import sys
from math import cos, pi, sinfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QPushButton, QLineEdit, QSpinBox
from PySide6.QtWidgets import QFormLayout
from PySide6.QtGui import  QPageSize, QPainter, QPdfWriter, QPen
from PySide6.QtCore import  QPointFclass MyWidget(QWidget):def __init__(self):super().__init__()self.spinBox_copies = QSpinBox()self.spinBox_copies.setRange(1, 100)self.lineEdit_file = QLineEdit()self.lineEdit_file.setText("output.pdf")self.button_printer = QPushButton("打印")self.button_printer.clicked.connect(self.button_printer_clicked)formLayout = QFormLayout(self)formLayout.addRow("设置打印份数", self.spinBox_copies)formLayout.addRow("输出到文件", self.lineEdit_file)formLayout.addRow(self.button_printer)def button_printer_clicked(self):pdf_writer = QPdfWriter(self.lineEdit_file.text())                      # 创建一个PDF生成器,并设置输出文件名pdf_writer.setPdfVersion(QPdfWriter.PdfVersion.PdfVersion_1_6)          # 设置PDF版本为1.page_size = QPageSize(QPageSize.PageSizeId.A4)                          # 设置页面大小为A4pdf_writer.setPageSize(page_size)                                       # 设置PDF生成器的纸张尺寸painter = QPainter()if painter.begin(pdf_writer):pen = QPen()pen.setWidth(5)                                                 # 设置画笔宽度为5painter.setPen(pen)                                             # 设置画笔size = page_size.size(QPageSize.Unit.Millimeter)x = size.width() * 20y = size.height() * 20r = min(x / 2, y / 2)p1 = QPointF(r * cos(-90 * pi / 180) + x , r * sin(-90 * pi / 180) + y)p2 = QPointF(r * cos(-18 * pi / 180) + x , r * sin(-18 * pi / 180) + y)p3 = QPointF(r * cos(54 * pi / 180) + x , r * sin(54 * pi / 180) + y)p4 = QPointF(r * cos(126 * pi / 180) + x , r * sin(126 * pi / 180) + y)p5 = QPointF(r * cos(198 * pi / 180) + x , r * sin(198 * pi / 180) + y)page_copies = self.spinBox_copies.value()for i in range(1, page_copies + 1):painter.drawPolyline([p1, p3, p5, p2, p4, p1])print(f"正在提交第{i}页,共{page_copies}页")if i != page_copies:pdf_writer.newPage()painter.end()if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

六、打印对话框

  除了直接用 QPrinter 进行打印外,还可以利用打印对话框 QPrintDialog 来打印,在对话框中完成对 QPrinter 的设置并进行打印。一般在打印前需要对打印的内容进行打印预览,打印预览对话框是 QPrintPreviewDialog,还可以利用打印预览控件 QPrintPreviewWidget 创建打印预览对话框。

  QPrintDialog 创建打印对话框的方法如下所示,为指定的 QPrinter 对象创建对话框需要提供 QPrinter,如果没有提供 QPrinter,将使用系统默认的打印机。

QPrintDialog(parent:QWidget=None)
QPrintDialog(printer:QPrinter,parent:QWidget=None)

  QPrintDialog 打印对话框的常用方法如下:

# 实例方法
exec_() -> int                                                  # 模式显示对话框setOption(option:PrintDialogOption, on:bool=True) -> None       # 设置可选项
setOptions(options:Sequence[PrintDialogOption]) -> None         # 设置多个可选项
testOption(option:PrintDialogOption) -> bool                    # 测试是否设置了某种选项# 继承父类的虚拟方法
setVisible(visible:bool) -> bool                # 设置对话框可见性

  一般用 exec_() 方法模式显示对话框,在对话框中单击“打印”按钮,返回值为 1,同时发送 accepted(printer:QPrinter) 信号,在对话框中单击“取消”按钮,返回值为 0。也可用 setVisible(visible:bool) 方法或 show() 方法显示对话框,这两种方法没有返回值。

  QPrintDialog 只有一个信号 accepted(printer:QPrinter),在对话框中单击“打印”按钮时发送信号,参数是设置了打印参数的 QPrinter 对象。

  QPrintDialog 打印对话框的常用信号如下:

accepted(printer:QPrinter)
import sys
from math import cos, pi, sinfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QPushButton
from PySide6.QtPrintSupport import QPrintDialog
from PySide6.QtPrintSupport import QPrinter
from PySide6.QtGui import QPainter, QPen
from PySide6.QtCore import  QPointFclass MyWidget(QWidget):def __init__(self):super().__init__()self.button_printer = QPushButton("打印", self)self.button_printer.clicked.connect(self.button_printer_clicked)self.print_dialog = QPrintDialog(self)self.print_dialog.accepted.connect(self.print_dialog_accepted)def button_printer_clicked(self):self.print_dialog.exec()def print_dialog_accepted(self, printer:QPrinter):if printer.isValid():painter = QPainter()if painter.begin(printer):pen = QPen()pen.setWidth(5)                                                 # 设置画笔宽度为5painter.setPen(pen)                                             # 设置画笔# 获取中心点坐标x = printer.paperRect(QPrinter.Unit.DevicePixel).width() / 2y = printer.paperRect(QPrinter.Unit.DevicePixel).height() / 2r = min(printer.pageRect(QPrinter.Unit.DevicePixel).width() / 2, printer.pageRect(QPrinter.Unit.DevicePixel).height() / 2)p1 = QPointF(r * cos(-90 * pi / 180) + x , r * sin(-90 * pi / 180) + y)p2 = QPointF(r * cos(-18 * pi / 180) + x , r * sin(-18 * pi / 180) + y)p3 = QPointF(r * cos(54 * pi / 180) + x , r * sin(54 * pi / 180) + y)p4 = QPointF(r * cos(126 * pi / 180) + x , r * sin(126 * pi / 180) + y)p5 = QPointF(r * cos(198 * pi / 180) + x , r * sin(198 * pi / 180) + y)painter.drawPolyline([p1, p3, p5, p2, p4, p1])painter.end()if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

七、打印预览对话框

  打印预览对话框 QPrintPreviewDialog 实际上包含一个打印预览控件 QPrintPreviewWidget,用户可以将打印预览控件 QPrintPreviewWidge t嵌入到自己的应用程序中,从而不使用打印预览对话框进行打印预览,而是在自定义的界面中进行打印预览。

  用 QPrintPreviewWidget 进行打印预览的过程与用打印预览对话框 QPrintPreviewDialog 进行预览的过程相同。首先要创建 QPrintPreviewWidget 的应用实例,可以将其放入其他控件中,然后将 QPrintPreviewWidget 的信号 paintRequested(printer:QPrinter) 与槽函数连接,最后在对应的槽函数中编写要打印的内容。

  QPrintPreviewWidge 继承自QWidget,用 QPrintPreviewWidge 创建打印预览控件的方法如下所示:

QPrintPreviewWidget(parent:QWidget=None, flags:Qt.WindowFlags)
QPrintPreviewWidget(printer:QPrinter, parent:QWidget=None, flags:Qt.WindowFlags= Default(Qt.WindowFlags))

  如果没有指定 printer 参数,则使用系统默认的打印机。

  打印预览对话框 QPrintPreviewDialog 的显示方法仍是 exec()setVisible(visible:bool)show() 方法,在显示对话框之前会发送 paintRequested(printer:QPrinter) 信号,需要在 paintRequested(printer:QPrinter) 对应的槽函数中编写要预览的内容,把内容输入到参数 printer 上。要获取打印对话框中关联的打印机,可以使用 QPrintPreviewDialog的 printer() 方法。

import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import  QTextEdit
from PySide6.QtWidgets import QMenuBar
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtPrintSupport import QPrinter, QPrinterInfo, QPrintDialog, QPrintPreviewDialog
from PySide6.QtCore import Qtclass MyWidget(QWidget):def __init__(self):super().__init__()self.showMaximized()menu_bar = QMenuBar()file_menu = menu_bar.addMenu("文件(&F)")open_action = file_menu.addAction("打开(&O)")open_action.triggered.connect(self.open_action_triggered)preview_action = file_menu.addAction("打印预览(&V)")preview_action.triggered.connect(self.preview_action_triggered)print_action = file_menu.addAction("打印(&P)")print_action.triggered.connect(self.print_action_triggered)file_menu.addSeparator()file_menu.addAction("退出(&E)").triggered.connect(self.close)self.textEdit = QTextEdit()layout = QVBoxLayout(self)layout.addWidget(menu_bar)layout.addWidget(self.textEdit)self.printer = QPrinter(QPrinterInfo.defaultPrinter())def open_action_triggered(self):font = self.textEdit.font()font.setPointSize(30)self.textEdit.setFont(font)for i in range(10):self.textEdit.append("一定会有办法的!绝对没问题的!")def preview_action_triggered(self):preview_dialog = QPrintPreviewDialog(self.printer, self, flags=Qt.WindowType.WindowMinimizeButtonHint | Qt.WindowType.WindowMaximizeButtonHint |Qt.WindowType.WindowCloseButtonHint)preview_dialog.paintRequested.connect(self.preview_paintRequested)preview_dialog.exec()self.printer = preview_dialog.printer()def preview_paintRequested(self, printer:QPrinter):self.textEdit.print_(printer)def print_action_triggered(self):print_dialog = QPrintDialog(self.printer)print_dialog.accepted.connect(self.print_dialog_accepted)print_dialog.exec()def print_dialog_accepted(self, printer:QPrinter):self.textEdit.print_(printer)if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

八、打印预览控件

  打印预览对话框 QPrintPreviewDialog 实际上包含一个打印预览控件 QPrintPreviewWidget,用户可以将打印预览控件 QPrintPreviewWidget 嵌入到自己的应用程序中,从而不使用打印预览对话框进行打印预览,而是在自定义的界面中进行打印预览。

  用 QPrintPreviewWidget 进行打印预览的过程与用打印预览对话框 QPrintPreviewDialog 进行预览的过程相同。首先要创建 QPrintPreviewWidget 的应用实例,可以将其放入其他控件中,然后将 QPrintPreviewWidget 的信号 paintRequested(printer:QPrinter) 与槽函数连接,最后在对应的槽函数中编写要打印的内容。

  QPrintPreviewWidge 继承自 QWidget,用 QPrintPreviewWidge 创建打印预览控件的方法如下所示:

QPrintPreviewWidget(parent:QWidget=None, flags:Qt.WindowFlags)
QPrintPreviewWidget(printer:QPrinter, parent:QWidget=None, flags:Qt.WindowFlags= Default(Qt.WindowFlags))

  如果没有指定 printer 参数,则使用系统默认的打印机。

  QPrintPreviewDialog 打印对话框的常用方法如下:

# 实例方法
pageCount() -> int                                              # 获取页数
currentPage() -> int                                            # 获取当前预览的页
zoomFactor() -> float                                           # 获取缩放系数# 槽函数
updatePreview() -> None                                         # 更新预览,发送paintRequested(printer)信号
print_() -> None                                                # 用关联的QPrinter进行打印
setCurrentPage(pageNumber:int) -> None                          # 设置当前预览的页
setOrientation(orientation:QPageLayout.Orientation) -> None     # 设置预览方向
setPortraitOrientation() -> None                                # 设置预览为竖直方向
setLandscapeOrientation() -> None                               # 设置预览为横向方向
setViewMode(viewMode:QprintPreviewWidget.ViewMode) -> None      # 设置预览模式
setSinglePageViewMode() -> None                                 # 设置预览为单页模式
setFacingPagesViewMode() -> None                                # 设置预览为双页模式
setAllPagesViewMode() -> None                                   # 以所有页全部显示模式预览
setZoomMode(zoomMode:QPrintPreviewWidget.ZoomMode) -> None      # 设置缩放模式
setZoomFactor(zoomFactor:float) -> None                         # 设置缩放系数
zoomIn(zoom:float=1.1) ->None                                   # 缩小显示
zoomOut(zoom:float=1.1) -> None                                 # 放大显示
fitToWidth() -> None                                            # 以最大宽度方式显示当前页
fitInView() -> None                                             # 以最大适合方式显示当前页

  用 setViewMode(viewMode:QPrintPreviewWidget.ViewMode) 方法设置预览模式,参数 viewMode 可取值如下:

QPrintPreviewWidget.ViewMode.SinglePageView             # 单页模式,值是0
QPrintPreviewWidget.ViewMode.FacingPagesView            # 左右两页模式,值是1
QPrintPreviewWidget.ViewMode.AllPagesView               # 所有页模式,值是2

  可以对预览进行缩放,用 setZoomMode(zoomMode:QPrintPreviewWidget.ZoomMode) 方法设置缩放模式,参数 zoomMode 可取值如下:

QPrintPreviewWidget.ZoomMode.CustomZoom         # 自定义缩放模式,值是0
QPrintPreviewWidget.ZoomMode.FitToWidth         # 以最大宽度方式显示,值是1
QPrintPreviewWidget.ZoomMode.FitInView          # 以最大适合方式显示,值是2

  打印预览控件 QPrintPreviewWidget 的信号有 paintRequested(printer:QPrinter)previewChanged(),当显示打印预览控件或更新预览控件时发送 paintRequested(printer:QPrinter) 信号,需要在参数 printer 上写入需要预览的内容;当打印预览控件的内部状态发生改变时,例如预览方向发生改变,就会发送 previewChanged() 信号。

paintRequested(printer:QPrinter)            # 当显示打印预览控件或更新预览控件时发送信号
previewChanged()                            # 当打印预览控件的内部状态发生改变时发送信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874880.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MiniCPM-o 2.6 本地部署记录,Windows+RTX3060全部跑通!

上一篇中,大致聊了下国产小钢炮MiniCPM的特性,看起来很不错,可玩性很高。今天,主要来说一下,如何在本地运行这个项目。 添加图片注释,不超过 140 字(可选)配置过程花了一些时间,最终还是成功了,可以正常进行视频通话,语音通话,和聊天机器人。安装和测试过程中遇到了…

CTF-web-计算器

1.打开题目2.发现只能输入一个数字 3.查看源代码4.修改参数5.可以正确输入后得到flag

CTF-web-web2

1.打开靶场,发现是一个动图。2.通过直接查看源代码,发现flag3.flag :KEY{Web-2-bugKssNNikls9100}

WC 2025 游记

前情提要:CSP 运气好,苟进来了。然后 NOIP 爆炸,没去任何 THU/PKUWC。 Day 1 (1.17) 早上 5:30 起来往火车站跑,太幽默了。 到了就开始摆烂,胸牌只有一面有名字,另一面是“日程安排”。晚上是开幕式,唯一亮点是 dzd 讲话。上大学的时候,政治老师说:资本主义必然灭亡,…

RTE 社区 2024 总结:虽然「卷」,但可以和一群朋友一起,找到自己的速度丨RTE 开发者社区

「如果用一个词来总结你的 2024,将会是什么?」「卷。」「朋友。」「速度。」2025 年 1 月 4 日,小寒前夕,在北京甜水园的苟市和上海静安的 Solution,一群 Real-Time AI&Voice Agent Builder 加入了一场名为 「RTE Dev Party 2024o」的年度开发者聚会。席间觥筹交错,欢…

要成为客户的顾问、朋友、陪跑者

在销售领域,传统的 “推销” 模式正逐步被更为人性化、服务导向的理念所取代。出色的销售人员不再仅仅局限于销售产品,更重要的是身兼客户的顾问、朋友与陪跑者这三重角色。以下为您介绍如何在这三个角色间灵活转换,以此深化客户关系,提高销售业绩。 一、成为客户的顾问专业…

卡特兰数 Catalan

卡特兰数 定义 \(Catalan\) 数列 \(H_n\) 是以下问题的方案数:有一个大小为 \(n n\) 的方格图,左下角为 \((0, 0)\) 右上角为 \((n, n)\),从左下角开始 每次都只能向右或者向上走一单位,不走到对角线 \(y = x\) 上方(但可以触碰) 的情况下到达右上角有多少可能的路径? …

【vjudge训练记录】大一寒假专项训练——并查集

训练情况A题 并查集模板,求班级最多人数和班级数,可以使用map进行统计,取父节点塞进map里面,取最大值和size即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;const int N = 1e5 + 3;int fa[N];int n,m;int …

2024山西中考数学第15题

如图,在 $▱ABCD$ 中,$AC$ 为对角线,$AE⊥BC$ 于点 E,点 $F$ 是 $AE$ 延长线上一点,且 $∠ACF = ∠CAF$,线段 $AB$,$CF$ 的延长线交于点 $G$,若 $AB=\sqrt{5}$,$AC=4$,$\tan∠ABC=2$,则 $BG$ 的长为_________.解析 勾股定理+建系 过程 解:由题得,$AE=2$,$BE=1$。…

云--云计算设计模式

https://www.cloudpatterns.org/异常

CTS2025Day1T1 倾诉

以下定义 \(lim=\lceil\log a\rceil\)。 首先结构一定是形如将整个序列划分成若干子段,形如 \((l,r,p)\) 的结构,其中 \(p\ge r\),并且 \(p\) 严格单调递增,那么这一段的操作次数就是 \(p-l\),不妨令 \(f(l,r,p)\) 表示对应的权值。由于 \(a_n\ge 1\),所以说明最后一段的…

你希望 Windows 在你离开电脑多久后要求你重新登录? windows 11 家庭版 去掉登录开机密码

你希望 Windows 在你离开电脑多久后要求你重新登录? 你的电脑的电源设置阻止显示某些选项。windows 11 家庭版 去掉密码方法一、使用用户账户关闭登录密码 【不可行】1、点击“开始菜单”,在“搜索”框中输入“netplwiz”,并点击打开。2、在弹出的窗口中,选中需要更改的账户…