目次
1. QtPrintSupport を使用してプリンターに直接接続します - 一般的には使用されません
2. 印刷ダイアログ QPrintDialog、印刷設定ダイアログ QPageSetupDialog
注:QDialog.Accepted == printerDialog.exec()
「ポップアップ印刷設定ウィンドウ」ボタンの効果をクリックします。
結果の印刷 - テキスト ボックスに付属の print (printer) メソッドを使用すると、入力内容がプリンターに印刷されます。
1. QtPrintSupport を使用してプリンターに直接接続します - 一般的には使用されません
1) 基礎知識
textEdit テキストボックスの内容を PDF に印刷する 3 つの方法
方法 1: テキスト ボックス データを画像として取得しますが、表示されているデータのみが印刷されます ####### # screen = self.text1.grab() # # 画像をプリンタに描画します # Painter .drawPixmap( 10,10,screen) # 左上隅の点は (10,10) です 方法 2: テキスト ボックスの内容を取得してプリンターに描画します。書式付きで印刷することはできず、1 行に印刷されます ## ##### # text = self.text1.toPlainText() #painter.drawText(10,10,text) 方法 3: テキスト ボックスに付属の印刷を直接呼び出す、失敗しました ######### ###### self.text1.print(プリンター)何も印刷されない
2) 完全なコードケース
'''
直接调用打印机,利用QPainter和QtPrintSupport()实现
'''
from PyQt5 import QtWidgets,QtPrintSupport
from PyQt5.QtWidgets import QPushButton,QTextEdit,QVBoxLayout
from PyQt5.QtGui import QPainter
import sys
class printSupportDemo(QtWidgets.QWidget):
def __init__(self):
super(printSupportDemo, self).__init__()
layout = QVBoxLayout()
self.btn1 = QPushButton("打印")
self.text1 = QTextEdit()
self.text1.setText("123\n\n\ntest\n\n\ntest\ntest\ntest\ntest\n---------------------\ntest\ntest\ntest\ntest\n---------------------")
self.btn1.clicked.connect(self.printText)
layout.addWidget(self.btn1)
layout.addWidget(self.text1)
self.setLayout(layout)
# 打印
def printText(self):
# 获取打印机对象
printer = QtPrintSupport.QPrinter()
# 创建一个画布——因为打印其实就是将打印区域变成一个图像,然后逐像素打印在纸上
painter = QPainter() ## 将画布设置在打印机上
# 将画布设置在打印机上
painter.begin(printer)
###################方法一:将文本框数据作为一个图像抓取过来,但是只有显示的数据才会打印出来#######
# screen = self.text1.grab()
# # 将图像绘制到打印机上
# painter.drawPixmap(10,10,screen) # 左上角点为(10,10)
###################方法二:获取文本框的内容,绘制到打印机中,无法带格式打印,会打印在一行#######
# text = self.text1.toPlainText()
# painter.drawText(10,10,text)
##################方法三:直接调用文本框自带的打印,失败###############
self.text1.print(printer)
# 结束打印
painter.end()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainWin = printSupportDemo()
mainWin.show()
app.exec_()
3) 結果
最終的にはPDFファイルが出力されます
2. 印刷ダイアログ QPrintDialog、印刷設定ダイアログ QPageSetupDialog
1) 印刷設定ダイアログボックスをポップアップ表示します。
def showSettingsDialog(self):
settingsDialog = QPageSetupDialog(self.printer,self) # 在当前窗口针对打印机对象弹出设置对话框
settingsDialog.exec() # 循环
2) 印刷ダイアログボックスが表示されます
def showPrintDialog(self):
printerDialog = QPrintDialog(self.printer,self) # 在当前窗口针对打印机对象弹出打印对话框
# printerDialog.exec()表示等待用户的操作,QDialog.Accepted表示用户操作了类似于确认的操作,当用户的操作时确认的操作时,执行if下面的语句
if QDialog.Accepted == printerDialog.exec():
self.textEdit.print(self.printer)
注:QDialog.Accepted == printerDialog.exec()
printerDialog.exec()は、ダイアログボックスがユーザーの操作を待っていることを示し、ユーザーが操作するとステータスを返します。
QDialog.Accepted は、ダイアログ ボックスのユーザーが確認や印刷など、OK と同様の操作を実行したことを示します。
この文の意味は、ユーザーが印刷などの特定の操作をクリックすると、if ステートメント以下のコードが実行されるということです。
3) 完全なコード
ミッションの詳細
''
タスク:
1. ファイルを開き、TextEdit でファイルの内容を表示します。
2. プリンタ設定ウィンドウをポップアップ表示し、印刷パラメータを設定します。
3. 印刷ウィンドウをポップアップ表示し、TextEdit でテキストの内容を印刷します (ここでは、 PDF に出力) 例
「」
コード
from PyQt5.QtWidgets import QWidget,QPushButton,QTextEdit,QVBoxLayout,QFileDialog,QDialog
from PyQt5.QtPrintSupport import QPrinter,QPrintDialog,QPageSetupDialog
import sys
class printDialogDemo(QWidget):
def __init__(self):
super(printDialogDemo, self).__init__()
# 创建打印机对象
self.printer = QPrinter()
# 创建三个按钮
self.btn1 = QPushButton("打开文件") # 打开文件并且将文件内容显示在TextEdit中
self.btn2 = QPushButton("弹出打印设置窗口") # 弹出打印设置窗口
self.btn3 = QPushButton("打印") # 进行打印
# 创建文本框,用于显示打印的文本内容
self.textEdit = QTextEdit()
# 设置垂直布局将控件放入
layout = QVBoxLayout()
layout.addWidget(self.btn1)
layout.addWidget(self.btn2)
layout.addWidget(self.btn3)
layout.addWidget(self.textEdit)
# 将布局设置在窗口
self.setLayout(layout)
self.setWindowTitle("利用PyQt5进行文件打印")
# 按钮设置槽函数
self.btn1.clicked.connect(self.openFile)
self.btn2.clicked.connect(self.showSettingsDialog)
self.btn3.clicked.connect(self.showPrintDialog)
def openFile(self):
fname = QFileDialog.getOpenFileName(self,"打开文件",".")
if fname[0]:
# 打开文件,将文件的内容显示在文本框中
with open(fname[0],'r',encoding="utf-8") as f:
self.textEdit.setText(f.read())
def showSettingsDialog(self):
settingsDialog = QPageSetupDialog(self.printer,self) # 在当前窗口针对打印机对象弹出设置对话框
settingsDialog.exec() # 循环
def showPrintDialog(self):
printerDialog = QPrintDialog(self.printer,self) # 在当前窗口针对打印机对象弹出打印对话框
# printerDialog.exec()表示等待用户的操作,QDialog.Accepted表示用户操作了类似于确认的操作,当用户的操作时确认的操作时,执行if下面的语句
if QDialog.Accepted == printerDialog.exec():
self.textEdit.print(self.printer)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainWin = printDialogDemo()
mainWin.show()
app.exec_()
実行インターフェイス効果
「ファイルを開く」ボタンの効果をクリックします
開くファイルを選択した後
「ポップアップ印刷設定ウィンドウ」ボタンの効果をクリックします。
ページの余白、サイズ、方向などを設定できることがわかります。
「印刷」ボタンをクリックすると効果が得られます
プリンターを選択できますが、ここでは例としてpdfで出力します。
結果の印刷 - テキスト ボックスに付属の print (printer) メソッドを使用すると、入力内容がプリンターに印刷されます。
self.textEdit.print(self.printer)
ご覧のとおり、印刷された PDF はテキスト ボックスのすべての内容を印刷でき、形式は変わりません (分割されます)。