打印对话框和打印预览
除了直接用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
用于指定打印范围选择选项。
Constant Description QAbstractPrintDialog.AllPages 所有页面都应打印出来。 QAbstractPrintDialog.Selection 只应打印所选内容。 QAbstractPrintDialog.PageRange 应打印指定的页面范围。 QAbstractPrintDialog.CurrentPage 只应打印当前可见的页面。 -
PySide6.QtPrintSupport.QAbstractPrintDialog.PrintDialogOption
(继承enum.Flag)用于指定打印对话框的哪些部分应该可见。
Constant | Description |
---|---|
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样式)允许访问常用打印财产。在使用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控件中输人内容,单击文件菜单中的"打印预览"命令,弹出打印预览对话框,可查看打印效果;在打印预览对话框中单击按钮,弹出打印对话框即可进行打印,或者关闭打印预览对话框,单击文件菜单中的"打印"命令,弹出打印对话框进行打印。
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()信号。