17-窗口、窗口控件、对话框以及相关功能类-打印对话框和打印预览

打印对话框和打印预览

除了直接用QPrinter 进行打印外,还可以利用打印对话框 QPrintDialog 来打印,在对话框中完成对 QPrinter的设置并进行打印。

一般在打印前需要对打印的内容进行打印预览,打印预览对话框是 QPrintPreviewDialog,还可以利用打印预览控件 QPrintPreiewWidget创建打印预览对话框。PySide提供的 Windows 10平台下的打印对话框和打印预览对话框

QAbstractPrintDialog

QAbstractPrintDialog类为用于配置打印机的打印对话框提供了一个基本实现

此类实现getter和setter函数,这些函数用于自定义打印对话框中显示的设置,但不直接使用。使用QPrintDialog在应用程序中显示打印对话框。

from PySide6.QtPrintSupport import QAbstractPrintDialog

QAbstractPrintDialog(self,printer: PySide6.QtPrintSupport.QPrinter,parent: Union[PySide6.QtWidgets.QWidget,NoneType] = None)-> None
枚举值
  • PySide6.QtPrintSupport.QAbstractPrintDialog.PrintRange

    用于指定打印范围选择选项。

    ConstantDescription
    QAbstractPrintDialog.AllPages所有页面都应打印出来。
    QAbstractPrintDialog.Selection只应打印所选内容。
    QAbstractPrintDialog.PageRange应打印指定的页面范围。
    QAbstractPrintDialog.CurrentPage只应打印当前可见的页面。
  • PySide6.QtPrintSupport.QAbstractPrintDialog.PrintDialogOption

(继承enum.Flag)用于指定打印对话框的哪些部分应该可见。

ConstantDescription
QAbstractPrintDialog.PrintToFile"打印到文件"选项已启用。
QAbstractPrintDialog.PrintSelection打印选择选项已启用。
QAbstractPrintDialog.PrintPageRange页面范围选择选项已启用。
QAbstractPrintDialog.PrintShowPageSize仅当启用此选项时,才显示页面大小+页边距页面。
QAbstractPrintDialog.PrintCollateCopies已启用"整理副本"选项
QAbstractPrintDialog.PrintCurrentPage已启用打印当前页面选项
方法
方法返回参数说明
fromPage()int返回要打印的第一页默认情况下,此值设置为0。
maxPage()int返回页面范围内的最大页面。从问题4.4开始,此函数默认返回INT_MAX。以前的版本默认返回1。
minPage()int返回页面范围内的最小页面。默认情况下,此值设置为1。
printRange()QAbstractPrintDialog.PrintRange返回打印范围。
printer()PySide6.QtPrintSupport.QPrinter返回运行此打印机对话框的打印机。
setFromTo(fromPage:int,toPage:int)设置打印机的打印范围
setMinMax(min:int,max:int)将此对话框中的页面范围设置为从最小到最大。这也启用了PrintPageRange选项。
setOptionTabs(tabs)如果支持,将小部件列表设置为要在打印对话框上显示的选项卡。
目前,此选项仅在X11上受支持。
设置选项选项卡会将其所有权转移到打印对话框。
setPrintRange(range:QAbstractPrintDialog.PrintRange)将range中的打印范围选项设置为范围。
toPage()返回要打印的最后一页。默认情况下,此值设置为0。
QPageSetupDialog

QPageSetupDialog类为打印机上与页面相关的选项提供配置对话框。

在Windows和macOS上,页面设置对话框是使用本机页面设置对话框实现的。
请注意,在Windows和macOS上,自定义纸张尺寸不会反映在本机页面设置对话框中。此外,在QPrinter上设置的自定义页边距不会显示在本机macOS页面设置对话框中。

from PySide6.QtPrintSupport import QPageSetupDialog

QPageSetupDialog(parent: Union[PySide6.QtWidgets.QWidget,NoneType] = None)-> None
QPageSetupDialog(printer: PySide6.QtPrintSupport.QPrinter,parent: Union[PySide6.QtWidgets.QWidget,NoneType] = None)-> None
方法
方法描述
open(receiver:PySide6.QtCore.QObject,member:str)这是一个重载函数。
打开对话框并将其accepted()信号连接到接收器和成员指定的插槽。
当对话框关闭时,信号将从插槽断开。
QPageSetupDialog.printer()->PySide6.QtPrintSupport.QPrinter返回传递给QPageSetupDialog构造函数的打印机。
打印对话框QPrintDialog

打印对话框QPrintDialog提供了对QPrinter 各种参数的设置功能,例如打印机的选择、打印方向、颜色模式、打印份数、纸张和页边距 等。

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

from PySide6.QtPrintSupport import QPrintDialog

QPrintDialog(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
QPrintDialog(printer: PySide6.QtPrintSupport.QPrinter,parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
打印对话框QPrintDialog的详细说明

该对话框允许用户更改与文档相关的设置,如纸张大小和方向、打印类型(颜色或灰度)、页面范围和要打印的份数。

还提供了控件,使用户可以从可用的打印机中进行选择,包括任何配置的网络打印机。

通常,QPrintDialog对象是用QPrinter对象构造的,并使用exec()函数执行。

printDialog = QPrintDialog(printer,parent)
if printDialog.exec()== QDialog.Accepted:
    # print ...

如果用户接受该对话框,则QPrinter对象已正确配置用于打印。

plastique-printdialog1plastique-printdialog-properties2

打印机对话框(如上所示为Plastique样式)允许访问常用打印财产。在使用CUPS打印系统的X11平台上,可以通过对话框的"财产"按钮修改每个可用打印机的设置。

在Windows和macOS上,使用本机打印对话框,这意味着对话框上设置的某些QWidget和QDialog财产将不受尊重。macOS上的本机打印对话框不支持设置打印机选项,即setOptions()和setOption()无效。

在Qt 4.4中,可以使用静态函数在macOS上显示工作表。Qt 4.5不再支持此功能。如果您想要此功能,请使用open()。

属性

PySide6.QtPrintSupport.QPrintDialog.options: PrintDialogOptions

此属性包含影响对话框外观的各种选项。
默认情况下,所有选项都处于禁用状态。
应在显示对话框之前设置选项。在对话框可见时设置它们并不能保证对对话框产生即时效果(取决于选项和平台)。

访问功能:

  • options()
  • setOptions(options)
打印对话框QPrintDialog的常用方法

打印对话框 QPrintDialog的常用方法如表所示,主要方法介绍如下。

  • 一般用exec()方法模式显示对话框,在对话框中单击"打印"按钮,返回值为1,同时发送accepted(printer:QPrinter)信号,在对话框中单击"取消"按钮,返回值为0。也可用setVisible(visible: bool)方法或 show()方法显示对话框,这两种方法没有返回值。
  • 用setOption(option,on:bool=True)方法可以在显示对话框之前预先设置一些选项,其中 option 可取 QPrintDialog.PrintToFile、QPrintDialog.PrintSelection,QPrintDialog.PrintPageRange、QPrintDialog.PrintShowPageSize、QPrintDialog.PrintCollateCopies 或 QPrintDialog.PrintCurrentPage; 用testOption(option)方法测试是否设置了某个选项。
  • 用setPrintRange(range)方法设置打印范围选项,range 可取 QPrintDialog.AllPages、QPrintDialog.Selection、QPrintDialog.PageRange 或 QPrintDialog.CurrentPage;用setFromTo(fromPage: int,toPage:int)方法设置打印页数范围。
QPrintDialog的方法及参数类型返回值的类型说明
exec()int模式显示对话框
setVisible(visible:bool)None显示打印对话框
setOption(option,on:bool=True)None设置可选项
setOptions(options)None设置多个可选项
testOption(option)bool测试是否设置了某种选项
setPrintRange(range)None设置打印范围选项
setFromTo(fromPage: int,toPage: int)None设置打印页数范围
setMinMax(min:int,max: int)None设置打印页数的最小和最大值
printer()QPrinter获取打印机
打印对话框QPrintDialog的信号

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

打印对话框QPrintDialog的应用实例

运行下面的程序,单击"打印"按钮,弹出打印对话框,选择系统中的打印机、设置打印份数后,单击对话框中的"打印"按钮后开始打印。

这里打印的是五角星:

import sys
from PySide6.QtWidgets import QApplication,QWidget,QPushButton
from PySide6.QtPrintSupport import QPrinter,QPrintDialog
from PySide6.QtGui import QPen,QPainter
from PySide6.QtCore import QPointF
from math import sin,cos,pi


class MyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.btn_printer=QPushButton('打印',self)
        self.btn_printer.clicked.connect(self.btn_printer_clicked)
        self.printDialog=QPrintDialog(self)
        self.printDialog.accepted.connect(self.printDialog_accepted)

    def btn_printer_clicked(self):
        self.printDialog.exec()

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

                x=printer.paperRect(QPrinter.Unit.DevicePixel).width()/ 2  # 中心x坐标
                y=printer.paperRect(QPrinter.Unit.DevicePixel).height()/ 2  # 中心y坐标
                r=min(printer.pageRect(QPrinter.Unit.DevicePixel).width()/ 2,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 / 10)+ 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__':
    app=QApplication(sys.argv)
    win=MyWidget()
    win.show()
    sys.exit(app.exec())

打印预览对话框QPrintPreviewDialog

QPrintPreviewDialog类提供了一个对话框,用于预览和配置打印机输出的页面布局。更

在开始打印之前,一般需要预览打印的效果。预览打印效果可在打印预览对话框QPrintPreviewDialog 中进行。

用QPrintPreviewDialog 创建打印预览对话框的方法如下所示,一般需要提供一个已经定义的QPrinter 对象,如果没有提供则用系统默认的打印机。

from PySide6.QtPrintSupport import QPrintPreviewDialog

QPrintPreviewDialog(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,flags: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None
QPrintPreviewDialog(printer: PySide6.QtPrintSupport.QPrinter,parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,flags: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None

打印预览对话框 QPrintPreviewDialog的显示方法仍是exec()、setVisible(visible:bool)或 show()方法,

在显示对话框之前会发送 paintRequested(printer:QPrinter)信号,需要在 paintRequested(printer:QPrinter)对应的槽函数中编写要预览的内容,把内容输人到参数printer 上。

要获取打印对话框中关联的打印机,可以使用QPrintPreviewDialog 的printer()方法。

打印预览对话框QPrintPreviewDialog说明

在现有应用程序中使用QPrintPreviewDialog非常简单:

  • 创建"打印预览"对话框。

    您可以使用现有的QPrinter对象构造QPrintPreviewDialog,也可以让QPrintPPreviewDialog为您创建一个,这将是系统默认的打印机。

  • 将paintRequested()信号连接到插槽。

    当对话框需要生成一组预览页面时,会发出paintRequest()信号。您可以使用与生成预览完全相同的代码进行实际打印,包括调用newPage()在预览中启动新页面。将一个插槽连接到paintRequested()信号,在那里绘制传递到插槽中的QPrinter对象。

  • 调用exec()。

    调用exec()以显示预览对话框。

打印预览对话框QPrintPreviewDialog方法
方法描述
open(receiver:PySide6.QtCore.QObject,member:str)这是一个重载函数。
打开对话框并将其完成(int)信号连接到接收器和成员指定的插槽。
当对话框关闭时,信号将从插槽断开。
printer()->PySide6.QtPrintSupport.QPrinter返回指向此对话框当前正在操作的QPrinter对象的指针。
打印预览对话框QPrintPreviewDialog信号
信号描述
paintRequested(printer:PySide6.QtPrintSupport.QPrinter)当QPrintPreviewDialog需要生成一组预览页面时,会发出此信号。
提供的打印机实例是绘制设备,您应该在该设备上绘制每页的内容,使用QPrinter实例的方式与直接打印时相同。
打印预览对话框QPrintPreviewDialog实例

下面的程序是打印预览对话框和打印对话框的应用实例。运行该程序,在QTextEdit控件中输人内容,单击文件菜单中的"打印预览"命令,弹出打印预览对话框,可查看打印效果;在打印预览对话框中单击按钮,弹出打印对话框即可进行打印,或者关闭打印预览对话框,单击文件菜单中的"打印"命令,弹出打印对话框进行打印。

image-20230220000424757

import sys
from PySide6.QtWidgets import QApplication,QWidget,QTextEdit,QMenuBar,QVBoxLayout
from PySide6.QtPrintSupport import QPrintPreviewDialog,QPrintDialog,QPrinter,QPrinterInfo
from PySide6.QtCore import Qt


class MyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.showMaximized()
        menuBar=QMenuBar()
        fileMenu=menuBar.addMenu("文件(&F)")
        openaction=fileMenu.addAction("打开")
        openaction.triggered.connect(self.openaction_triggered)##信号与槽连接

        previewAction=fileMenu.addAction("打印预览")
        previewAction.triggered.connect(self.previewhction_triggered)# 信号与槽连接

        printAction=fileMenu.addAction("打印")
        printAction.triggered.connect(self.printAction_triggered)# 信号与槽连接

        fileMenu.addSeparator()
        fileMenu.addAction("退出").triggered.connect(self.close)# 信号与槽连接

        self.textEdit=QTextEdit()

        V=QVBoxLayout(self)
        V.addWidget(menuBar)
        V.addWidget(self.textEdit)
        self.printer=QPrinter(QPrinterInfo.defaultPrinter())# 创建默认的打印机

    def openaction_triggered(self):  # 槽函数
        # 在此添加打开文件代码,将内容读取到QTextEdit 中,这里以简单文本代替
        font=self.textEdit.font()
        font.setPointSize(30)
        self.textEdit.setFont(font)
        for i in range(100):
            self.textEdit.append("北京诺思多维科技有限公司")

    def previewhction_triggered(self):  # 槽函数
        # 打印预览对话框
        previewDialog=QPrintPreviewDialog(self.printer,self,flags=Qt.WindowFlags.WindowMinimizeButtonHint | Qt.WindowFlags.WindowMaximizeButtonHint | Qt.WindowFlags.WindowCloseButtonHint)
        previewDialog.paintRequested.connect(self.preview_paintRequested)
        previewDialog.exec()

        self.printer=previewDialog.printer()

    def preview_paintRequested(self,printer):  # 槽函数
        self.textEdit.print_(printer)# 预览QTextEdit控件中的内容

    def printAction_triggered(self):  # 槽函数
        printDialog=QPrintDialog(self.printer)
        printDialog.accepted.connect(self.printDialog_accepted)# 信号与槽连接
        printDialog.exec()

    def printDialog_accepted(self,printer):  # 槽函数
        self.textEdit.print_(printer)# 打印QTextEdit控件中的内容


if __name__=='__main__':
    app=QApplication(sys.argv)
    win=MyWidget()
    win.show()
    sys.exit(app.exec())

打印预览控件QprintPreviewWidget

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

用QPrintPreviewWidget进行打印预览的过程与用打印预览对话框QPrintPreviewDialog进行预览的过程相同。

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

QPrintPreviewWidge 继承自QWidget,用QPrintPreviewWidge创建打印预览控件的方法如下所示,如果没有指定printer 参数,则使用系统默认的打印机。

from PySide6.QtPrintSupport import QPrintPreviewWidget

QPrintPreviewWidget(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,
                    flags: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None

QPrintPreviewWidget(printer: PySide6.QtPrintSupport.QPrinter,
                    parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None,
                    flags: PySide6.QtCore.Qt.WindowType=Default(Qt.WindowFlags))-> None
打印预览控件QPrintPreviewWidget 的常用方法

打印预览控件QPrintPreviewWidget 的常用方法如表所示,主要方法介绍如下。

  • 用updatePreview()方法可以更新预览,发送 paintRequested(printer)信号;用print_)方法打印预览的内容。

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

    • PrintPreviewWidget.SinglePageView(单页模式,值是0)
    • QPrintPreviewWidget.FacingPagesView(左右两页模式,值是1)
    • QPrintPreviewWidget.AllPagesView(所有页模式,值是2)

    也可分别使用setSinglePageViewMode()方法、setFacingPagesViewMode()方法或 setAlIPagesViewMode()方法设置。

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

    • QPrintPreviewWidget.CustomZoom(自定义缩放模式,值是0)
    • QPrintPreviewWidget.FitToWidth(以最大宽度方式显示,值是1)
    • QPrintPreviewWidget.PitInView(以最大适合方式显示,值是2)。

    后两种模式可以用{fitToWidth()方法和fitInView()方法代替;

    对于自定义缩放模式,可以先用setZoomFactor(zoomFactor:float)方法定义缩放系数,然后用zoomIn(zoom:float=1.1)方法和zoomOut(zoom:float=1.1)方法进行缩放。

QPrintPreviewWidget的方法及参数类型返回值的类型说 明
[slot]updatePreview()None更新预览,发送 paintRequested(printer)信号
pageCount()int获取页数
[slot]print_()None用关联的QPrinter进行打印
[slot]setCurrentPage(pageNumber:int)None设置当前预览的页
currentPage()int获取当前预览的页
[slot]setOrientation(orientation: QPageLayout.Orientation)None设置预览方向
[slot]setLandscapeOrientation()None横向预览
[slot]setPortraitOrientation()None纵向预览
[slot]setViewMode(viewMode: QPrintPreviewWidget.ViewMode)None设置预览模式
[slot]setSinglePageViewMode()None以单页模式预览
[slot]setFacingPagesViewMode()None以左右两页模式预览
[slot]setAllPagesViewMode()None以所有页全部显示模式预览
[slot]setZoomMode(zoomMode: QPrintPreviewWidget.ZoomMode)None设置缩放模式
[slot]fitToWidth()None以最大宽度方式显示当前页
[slot]fitInView()None以最大适合方式显示当前页
[slot]setZoomFactor(z00mFactor:float)None设置缩放系数
zoomFactor()float获取缩放系数
[slot]zoomIn(zoom:float=1.1)None缩小显示
[slot]zoomOut(zoom: float=1.1)None放大显示
打印预览控件QPrintPreviewWidget信号

打印预览控件 QPrintPreviewWidget 的信号有 paintRequested(printer: QPrinter)和previewChanged()

  • 当显示打印预览控件或更新预览控件时发送 paintRequested(printer:QPrinter)信号,需要在参数 printer 上写人需要预览的内容;
  • 当打印预览控件的内部状态发生改变时,例如预览方向发生改变,就会发送previewChanged()信号。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值