当前位置: 代码迷 >> 综合 >> 实战PyQt5: 080-打印输出
  详细解决方案

实战PyQt5: 080-打印输出

热度:75   发布时间:2024-01-18 09:09:22.0

Qt为打印提供了广泛的跨平台支持。使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机,也可以跨网络打印到远程打印机。Qt的打印系统还支持PDF文件生成。

Qt提供了一些类来支持打印机的选择和设置以及打印输出

  • QPageSetupDialog,页面配置对话框,用于配置打印机上与页面相关的选项。
  • QPrintDialog, 用于指定打印机配置的对话框。
  • QPrintEngine,定义一个接口,用于QPrinter如何与给定的打印子系统交互。
  • QPrintPreviewDialog, 打印预览对话框,用于预览和配置打印机输出页面布局。
  • QPrintPreviewWidget, 打印预览部件,用于预览输出到打印机的页面布局。
  • QPrinter, 在打印机上绘图的绘图设备。
  • QPrinterInfo, 访问有关现有打印机的信息。

在Qt中,打印机由QPrinter来代表,QPrinter是一种绘图设备,可以提供特定的打印功能支持,例如支持多页和双面输出。

QPrinter

QPrinter类是在打印机上绘图的绘图设备。该设备代表一系列的打印输出页面,其使用方式和其他绘图设备(如QWidget和QPixmap)几乎完全相同。在Windows或macOS上直接打印到打印机时,QPrinter使用内置的打印机驱动程序。在X11上,QPrinter使用通用Unix打印系统(CUPS)将PDF输出发送到打印机。

注意,在无效打印机上设置纸张尺寸和分辨率等参数是未定义的。

QPrinter常用方法:

  • setPageLayout(): 设置页面布局;
  • setPageMargins(): 按当前单位来设置页边距,成功设置返回True;
  • setPageOrder(): 设置页面顺序;
  • setPageOrientation(): 设置页面方面,打印机驱动程序读取此设置,并以指定的方向打印页面;
  • setPageSize(): 设置页面大小;
  • setPapersource(): 设置纸张来源;
  • setPrintRange(): 设置打印范围;
  • setResolution(): 设置打印分辨率。

QPrinter类继承关系:

实战PyQt5: 080-打印输出

 

QPageSetupDialog

QPageSetupDialog类为打印机上与页面相关的选项提供了一个配置对话框。在Windows和macOS上,页面设置对话框是使用本机页面设置对话框实现的。

QPageSetupDialog类继承关系:

实战PyQt5: 080-打印输出

 

QPrintDialog

QPrintDialog类提供了一个用于指定打印机配置的对话框。该对话框允许用户更改与文档相关的设置,例如纸张尺寸和方向,打印类型(彩色或灰度),页面范围以及要打印的份数。它提供控件以使用户能够从可用的打印机中进行选择,包括任何已配置的网络打印机。 在Windows和macOS上,使用本机打印对话框。

QPrintDialog常用方法:

  • open(): 打开对话框并将其accepted()信号连接到receiver和member指定的插槽。关闭对话框后,信号将从插槽中断开;
  • printer(): 返回操作此打印机对话框的打印机;
  • setOption(): 启用或者清除指定的设置;
  • testOption(): 测试是否启动了给定的选项设置,如果启用了,返回True,否则返回False。

QPrintDialog常用信号:

  • accepted: 当用户接受在打印对话框中设置的值时,将发出此信号。该打印机参数包括设置被应用到打印机。

QPrintDialog类继承关系:

实战PyQt5: 080-打印输出

 

测试代码

测试代码演示了使用QTextEdit加载一个文本文件,然后进行页面设置,选择打印机后,使用QTextEdit.print() 函数完成打印。完整代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenuBar, QAction,QTextEdit, QDialog, QFileDialog, QMessageBox)
from PyQt5.QtPrintSupport import QPageSetupDialog,QPrintDialog, QPrinterclass DemoPrint(QMainWindow):def __init__(self, parent=None):super(DemoPrint, self).__init__(parent)   # 设置窗口标题self.setWindowTitle('实战PyQt5: 打印输出演示')      # 设置窗口大小self.resize(600, 400)self.printer = QPrinter()self.initUi()def initUi(self):#菜单条menuBar = self.menuBar()menuFile = menuBar.addMenu('文件')#文件aOpen = QAction('打开...', self)aOpen.triggered.connect(self.onFileOpen)aPageSetup = QAction('页面设置', self)aPageSetup.triggered.connect(self.onFilePageSetup)aPrint = QAction('打印', self)aPrint.triggered.connect(self.onFilePrint)aExit = QAction('退出', self)aExit.triggered.connect(self.close)menuFile.addAction(aOpen)menuFile.addAction(aPageSetup)menuFile.addAction(aPrint)menuFile.addSeparator()menuFile.addAction(aExit)#窗口self.textEditor = QTextEdit()#设置为中心窗口self.setCentralWidget(self.textEditor)def msgCritical(self, strInfo):dlg = QMessageBox(self)dlg.setIcon(QMessageBox.Critical)dlg.setText(strInfo)dlg.show()def onFileOpen(self):path,_ = QFileDialog.getOpenFileName(self, '打开文件', '', '文本文件 (*.txt)')if path:try:with open(path, 'r') as f:text = f.read()except Exception as e:self.msgCritical(str(e))else:self.path = pathself.textEditor.setPlainText(text)def onFilePageSetup(self):dlgPageSetup = QPageSetupDialog(self.printer, self)dlgPageSetup.exec()def onFilePrint(self):dlgPrint = QPrintDialog(self.printer, self)if QDialog.Accepted == dlgPrint.exec():self.textEditor.print(self.printer)if __name__ == '__main__':app = QApplication(sys.argv)window = DemoPrint()window.show()sys.exit(app.exec()) 

运行结果如下图:

实战PyQt5: 080-打印输出

测试打印输出

本文知识点

  • Qt打印支持系统;
  • QPrinter是向打印机绘图的绘图设备;
  • QPageSetupDialong设置打印页面边距;
  • QPrintDialog选择打印机;
  • QTextEdit.print() 函数实现具体的打印。

前一篇: 实战PyQt5: 079-如何彻底删除布局中一个部件