70-输入和显示-打印-打印机QPrinter及实例

打印机QPrinter及实例

QPrinter 表示打印出来的纸张,可以作为QPainter的绘图设备来使用,QPainter 可以按照QPrinter绘制图形、文字和图像等内容。

QPrinter 继承自QPagedPaintDevice 和 QPaintDevice。用QPrinter 创建打印机实例的方法如下所示,其中参数 mode 设置打印模式,取值是 QPrinter.PrinterMode的枚举值,可取以下值,取不同的值会影响QPainter的视口。

  • QPrinter.ScreenResolution(使用屏幕分辨率)
  • QPrinter.HighResolution
from PySide6.QtPrintSupport import QPrinter

QPrinter(mode: PySide6.QtPrintSupport.QPrinter.PrinterMode=Instance(PySide6.QtPrintSupport.QPrinter.PrinterMode.ScreenResolution))-> None
QPrinter(printer: PySide6.QtPrintSupport.QPrinterInfo,
         mode: PySide6.QtPrintSupport.QPrinter.PrinterMode=Instance(PySide6.QtPrintSupport.QPrinter.PrinterMode.ScreenResolution))-> None
打印机QPrinter的常用方法

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

QPrinter的方法及参数类型返回值的类型说 明
setPrinterName(str)None设置打印机名称
printerName()str获取打印机名称
setOutputFileName(str)None设置打印到文件的文件名
outputFileName()str获取打印文件名
setOutputFomat(QPrinter.OutputFormat)None设置打印到文件时的格式
setFullPage(bool)None设置是否整页模式打印
setPageMargins(margins: Union[QMarginsF,QMargins],units: QPageLayout.Unit=QPageLayout.Millimeter)bool设置打印页边距
setCopyCount(int)None设置打印份数
copyCount()int获取打印份数
setCollateCopies(collate:bool)None设置是否对照打印
collateCopies()bool获取对照打印
setPromTo(fromPage: int,toPage:int)None设置打印页数的范围
fromPage()int获取打印范围起始页
toPage()int获取打印范围终止页
setPageOrder(QPrinter.PageOrder)None设置打印顺序
pageOrder()QPrinter.PageOrder获取打印顺序
setResolution(int)None设置打印精度
resolution()int获取打印精度
setPageOrientation(QPageLayout.Orientation)bool设置打印方向
newPage()bool生成新页
abort()bool取消正在打印的文档
fllPage()bool获取是否整页模式
isValid()bool获取打印机是否有效
PaPerRect(QPrinter.Unit)QRectF获取纸张范围
setPrintRange(tange: QPrinter.PrintRange)None设置打印范围的模式
printRange()QPrinter.PrintRange获取打印范围的模式
printerState()QPrinter.PrinterState获取打印状态
serColorMode(QPrinter.ColorMode)None设置颜色模式
colorMode()QPrinter.ColorMode获取颜色模式
setDocName(str)None设置打印来源文档名
docName()str获取文档名
setDuplex(duplex: QPrinter.DuplexMode)None设置双面模式
duplex()QPrinter.DuplexMode获取双面模式
setFontEmbeddingEnabled(enable: bool)None设置是否启用内置字体
fontEmbeddingEnabled()b001获取是否启用内置字体
setPageSize(Union[QPageSize,QPageSize.PageSizeId,QSize])bool设置打印纸的尺寸
pageRect(QPrinter.Unit)QRectF获取打印范围
setPaperSource(QPrinter.PaperSource)None设置纸张来源
paperSource()QPrinter.PaperSource获取纸张来源
supportedPaperSources()List[QPrinter.PaperSource]获取支持的纸张来源列表
setPdfVersion(QPagedPaintDevice.PdfVersion)None设置 pdf文档的版本
setPageRanges(ranges:QPageRanges)None设置选中的页数
pageRanges()QPageRanges获取选中的页数对象
setPageLayout(pageLayout: QPageLayout)bool设置页面布局
pageLayout()QPageLayout获取页面布局对象
supportedResolutions()List[int]获取打印机支持的分辨率列表
supportsMultipleCopies()bool获取是否支持多份打印

打印机QPrinter主要方法介绍如下。

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

  • 用setOutputFileName(str)方法设置打印机将打印内容打印到文件中而不是纸质介质上

    • 参数是文件名。如果不设置该内容或设置为空字符串,则将内容打印到纸张上;
    • 如果设置了扩展名是pdf的文件名,则将打印内容输出到pdf文档中;
    • 如果设置的扩展名不是pdf,则将打印内容输出到按照 setOutputFormat(QPrinter.OutputFormat)方法设置的文件格式的文件中,其中QPrinter.OutputFormat枚举值可取:
      • QPrinter.NativeFormat(本机定义格式,值是0)
      • QPrinter.PdfFormat(pdf格式,值是1)。
  • 在打印完第一页后,需要用newPage()方法通知打印机弹出当前正在打印的纸张,继续进行下一页的打印,成功则返回True;用abort()方法取消当前的打印,成功则返回True。

  • 用setFullPage(bool)方法设置是否是整页模式打印。

    • 在setFullPage(True)时,QPainter的坐标原点在可打印区的左上角,与纸张坐标系的原点重合,如图所示,但由于页边距的限制,实际上不能在整张纸上打印;

    • 在 setFullPage(False)时,QPainter的坐标原点在打印区域的左上角。

    • 页边距用setPageMargins(margins: Union[QMarginsF,QMargins],units: QPageLayout.Unit=QPageLayout,Millimeter)方法设置,其中单位 Unit 可取:

      • QPageLayout.Millimeter,QPageLayout.Point(=in/72)、
      • QPageLayout.Inch、QPageLayout.Pica(=in/6)
      • QPageLayout.DidQt(=0.375mm)
      • QPageLayout.Cicero(=4.5mm)

      对应值分别是0~6。

    • 用paperRect(QPrinter,Unit)方法和 pageRect(QPrinter.Unit)方法可以分别获取纸张和打印区的矩形区域QRectF,

      • QPrinter.Unit可取以下值,对应值分别是0~6。
        • QPrinter.Millimeter
        • QPrinter.Point
        • QPrinter.Inch
        • QPrinter.Pica
        • QPrinter.DidQt
        • QPrinter,Cicero
        • QPrinter.DevicePixel
  • 用setCopyCount(int)方法设置打印份数;

    • 用setCollateCopies(collate:bool)方法设置是否对照打印,在setCollateCopies(False)时,每张都会连续打印指定的份数。
  • 用setResolution(int)方法设置打印精度(分辨率),单位是dpi(dots per inch)。

  • 用setPageOrientation(QPageLayout.Orientation)方法设置打印方向,参数是·QPageLayout.Orientation 的枚举值,可取 QPageLayout.Portrait(纵向,值是0)、QPageLayout.Landscape(横向,值是1)

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

      • QPrinter.FirstPageFirst(正常顺序,值是0)
      • QPrinter.LastPageFirst(反向顺序,值是1)。
  • 用setPrintRange(range:QPrinter.PrintRange)方法设置打印范围的模式,参数range 可取:

    • QPrinter.AllPages(打印所有页,值是0)
    • QPrinter.Selection(打印选中的页,值是1)
    • QPrinter.PageRange(打印指定范围的页,值是2)
    • QPrinter.CurrentPage(打印当前页,值是3);
  • 用setFromTo(fromPage: int,toPage:int)方法或setPageRanges(ranges: QPageRanges)方法设置打印范围

    • 参数ranges是QPageRanges的对象,可以用QPageRanges的addPage(pageNumber:int)方法或addRange(from_: int,to: int)方法添加要打印的页;
    • 用clear()方法清除已经添加的页数;
    • 用静态方法fromString(ranges:str)将字符串转换成QPageRanges对象,QPageRanges类在QtGui 模块中。
  • 用setPageSize(Union[QPageSize,QPageSize.PageSizeId,QSize])方法可以设置纸张的尺寸,其中枚举值QPageSize.PageSizeld定义了一些常用的纸张尺寸,常用的纸张尺寸如表所示:

    • 也可用QPageSize(pageSizeId: QPageSize.PageSizeId)、QPageSize(size:Union[QSizeF,QSize],units: QPageSize.Unit)方法定义新的尺寸。

    • 用QPageSize的size(units:QPageSize.Unit)方法获取纸张尺寸 QSizeF;

    • 用sizePixels(resolution: int)方法获取用像素表示的尺寸QSize,或用sizePoints()方法获取用点表示的尺寸QSize。

      QPageSize.PageSizeId 的取值尺寸/(mmXmm)QPageSize.PageSizeId 的取值尺寸/(mmXmm)
      QPageSize.Letter0215.9×279.4QPageSize.B216500×707
      QPageSize.Legal1215.9×355.6QPageSize.B317353X500
      QPageSize.Executive2190.5×254QPageSize.B418250X353
      QPageSize.A03841X1189QPageSize.B519176X250
      QPageSize.Al4594×841QPageSize.B620125×176
      QPageSize.A25420×594QPageSize.B72188X125
      QPageSize.A36297×420QPageSize.B82262×88
      QPageSize.A47210×297QPageSize.B92344X62
      QPageSize.A58148X210QPageSize.B102431X44
      QPageSize.A69105×148QPageSize.C5E25163X229
      QPageSize.A71074X105QPageSize.Col0E26105×241
      QPageSize.A81152×74QPageSize.DLE27110X220
      QPageSize.A91237X52QPageSize.Folio28210X330
      QPageSize.BO141000×1414QPageSize.Ledger29431.8×279.4
      QPageSize,B115707×1000QPageSize.Tabloid30279.4×431.8
  • 用setPaperSource(QPrinter.PaperSource)方法设置纸张来源(位置),参数可取:

    • QPrinter.Auto
    • QPrinter.Cassette
    • QPrinter.Envelope
    • QPrinter.EnvelopeManual
    • QPrinter.FormSource
    • QPrinter.LargeCapacity
    • QPrinter.LargeFormat
    • QPrinter.Lower
    • QPrinter.MaxPageSource
    • QPrinter.Middle
    • QPrinter.Manual
    • QPrinter.OnlyOne
    • QPrinter.Tractor
    • QPrinter.SmallFormat
    • QPrinter.Upper
    • QPrinter.CustomSource
    • QPrinter.LastPaperSource

    用supportedPaperSources()方法获取打印机支持的纸张来源列表。

  • 用setPageLayout(pageLayout:QPageLayout)方法为打印机设置页面布局页面布局QPageLayout 用于设置页面的方向、页面尺寸和页边距。

    • 用QPageLayout 创建页面布局的方法是以下方法:

      from PySide6.QtGui import QPageLayout
      
      QPageLayout(self)-> None
      QPageLayout(Other: PySide6.QtGui.QPageLayout)-> None
      
      QPageLayout(pageSize: Union[PySide6.QtGui.QPageSize,PySide6.QtGui.QPageSize.PageSizeId,PySide6.QtCore.QSize],
                                  orientation: PySide6.QtGui.QPageLayout.Orientation,
                                  margins: Union[PySide6.QtCore.QMarginsF,PySide6.QtCore.QMargins],
                                  units: PySide6.QtGui.QPageLayout.Unit=Instance(QPageLayout.Unit.Point),
                                  minMargins: Union[PySide6.QtCore.QMarginsF,
                                  PySide6.QtCore.QMargins]=Instance(QMarginsF(0,0,0,0)))-> None
      
    • 利用QPageLayout 的 setPageSize(pageSize: Union[QPageSize,QPageSize.PageSizeld,QSize],minMargins: Union[QMarginsF,QMargins]=QMarginsF(0,0,0,0))方法可以设置纸张尺寸;

    • 用setOrientation(orientation:QPageLayout.Orientation)方法设置方向(横向或纵向);

    • 用setMargins(margins:Union[QMarginsF,QMargins])方法设置 页边距;

    • 用setUnits(units:QPageLayout.Unit)方法设置单位;

    • 用setMode(mode:QPageLayout.Mode)方法设置布局模式,参数mode 可取:

      • QPageLayout.StandardMode(打印范围包含页边距,值是0)
      • QPageLayout.FullPageMode(打印范围不含页边距,值是1)
实例

运行下面的程序,选择合适的打印机、设置打印份数,并可选择是否打印到文件,单击

打印"按钮后开始打印。在每页上打印一个五角星。

image-20230219003411217

import sys
from PySide6.QtWidgets import QApplication,QWidget,QComboBox,QPushButton,QCheckBox,QLineEdit,QSpinBox,QFormLayout
from PySide6.QtPrintSupport import QPrinter,QPrinterInfo
from PySide6.QtGui import QPen,QPainter,QPageSize,QPageLayout
from PySide6.QtCore import QPointF,QPoint
from math import cos,sin,pi


class MyWidget(QWidget):

    def __init__(self,parent=None):
        super().__init__(parent)
        self.comboBox=QComboBox()
        self.comboBox.currentTextChanged.connect(self.comboBox_currentText)# 信号与槽连接

        self.spin_copies=QSpinBox()
        self.spin_copies.setRange(1,100)

        self.checkBox=QCheckBox('输出到文件')
        self.checkBox.clicked.connect(self.checkBox_clicked)

        self.line_file=QLineEdit()
        self.line_file.setText('d:/stars.pdf')
        self.line_file.setEnabled(self.checkBox.isChecked())

        self.btn_printer=QPushButton('打印')
        self.btn_printer.clicked.connect(self.btn_printer_clicked)# 信号与槽连接

        formLayout=QFormLayout(self)
        formLayout.addRow("选择打印机:",self.comboBox)
        formLayout.addRow("设置打印份数:",self.spin_copies)
        formLayout.addRow(self.checkBox,self.line_file)
        formLayout.addRow(self.btn_printer)

        printerNames=QPrinterInfo.availablePrinterNames()
        self.comboBox.addItems(printerNames)
        self.comboBox.setCurrentText(QPrinterInfo.defaultPrinterName())

    def comboBox_currentText(self,text):  # 槽函数
        printInfo=QPrinterInfo.printerInfo(text)

        self.printer=QPrinter(printInfo)# 打印机
        self.printer.setPageOrientation(QPageLayout.Orientation.Portrait)
        self.printer.setFullPage(False)
        self.printer.setPageSize(QPageSize.A4)
        self.printer.setColorMode(QPrinter.ColorMode.GrayScale)

    def checkBox_clicked(self,checked):  # 槽函数
        self.line_file.setEnabled(checked)

    def btn_printer_clicked(self):  # 槽函数
        self.printer.setOutputFileName(None)

        if self.checkBox.isChecked():
            self.printer.setOutputFileName(self.line_file.text())# 设置打印到文件中if self.printer.isValid():
            self.painter=QPainter()

            if self.painter.begin(self.printer):
                pen=QPen()# 钢笔
                pen.setWidth(3)# 线条宽度
                self.painter.setPen(pen)# 设置钢笔

                x=self.printer.paperRect(QPrinter.Unit.DevicePixel).width()/ 2  # 中心x坐标
                y=self.printer.paperRect(QPrinter.Unit.DevicePixel).height()/ 2  # 中心y坐标
                r=min(self.printer.pageRect(QPrinter.Unit.DevicePixel).width()/ 2,self.printer.paperRect(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)
                pageCopies=self.spin_copies.value()

                for i in range(1,pageCopies + 1):
                    self.painter.drawPolyline([p1,p3,p5,p2,p4,p1])# 绘制五角星
                    print("正在提交第{}页,共{}页".format(i,pageCopies))
                    if i !=pageCopies:
                        self.printer.newPage()
                self.painter.end()


if __name__=='__main__':
    app=QApplication(sys.argv)

    win=MyWidget()

    win.show()

    sys.exit(app.exec())

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值