Шаг 307.
Библиотека PyQt5. Печать документов. Задание параметров принтера и страницы. Класс QPageSetupDialog

    На этом шаге мы рассмотрим назначение, форматы конструктора и основные методы этого класса, а также приведем пример использования его и ранее рассмотренных классов.

    Класс QPageSetupDialog реализует работу стандартного диалогового окна установки параметров страницы: размера, ориентации, отступов и др. Воочию его можно увидеть на рисунке 1.


Рис.1. Стандартное диалоговое окно установки параметров страницы

    Иерархия наследования этого класса:

  (QObject, QPaintDevice) - QWidget - QDialog - QPageSetupDialog

    Конструктор класса QPageSetupDialog имеет следующий формат:

  <Объект>  = QPageSetupDialog([parent=None])
  <Объект> = QPageSetupDialog(<QPrinter>[, parent=None])

    Первый формат создает диалоговое окно, привязанное к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса QPrinter. Необязательный параметр parent может быть использован для задания родителя.

    Принципы работы с диалоговым окном параметров страницы такие же, как и у его "коллеги", представляющего параметры принтера (см. предыдущий шаг): мы задаем нужные параметры страницы, вызывая соответствующие методы класса QPrinter, и выводим диалоговое окно на экран методом exec() или ехес_(). И, опять же, все заданные в этом диалоговом окне настройки будут применены к принтеру автоматически.

    Набор методов, поддерживаемых классом QPageSetupDialog, невелик, и все эти методы для нас малоинтересны. Любопытствующие могут обратиться к странице https://doc.qt.io/qt-5/qpagesetupdialog.html, где приведен их полный список.

    Практиковаться мы станем на утилите печати изображений, которую приведена ниже. Ее интерфейс очень прост и включает лишь кнопки открытия файла, вывода диалоговых окон настройки принтера и параметров страницы и собственно печати (рисунок 2).


Рис.2. Внешний вид приложения

    Вот его текст (изображения с шагов 306 и 307 - результат выбора соответствующих страниц):

from PyQt5 import QtCore, QtWidgets, QtGui, QtPrintSupport
import sys

class MyWindow(QtWidgets.QWidget):
    def __init__(self,  parent=None):
        QtWidgets.QWidget.__init__(self, parent, 
             flags=QtCore.Qt.Window | QtCore.Qt.MSWindowsFixedSizeDialogHint)
        self.setWindowTitle("Печать изображений")
        self.printer = QtPrintSupport.QPrinter()
        self.printer.setPageOrientation(QtGui.QPageLayout.Landscape)
        self.file = None
        vbox = QtWidgets.QVBoxLayout()
        btnOpen = QtWidgets.QPushButton("&Открыть файл...")
        btnOpen.clicked.connect(self.openFile)
        vbox.addWidget(btnOpen)
        btnPageOptions = QtWidgets.QPushButton("Настройка &страницы...")
        btnPageOptions.clicked.connect(self.showPageOptions)
        vbox.addWidget(btnPageOptions)
        btnPrint = QtWidgets.QPushButton("&Печать...")
        btnPrint.clicked.connect(self.print)
        vbox.addWidget(btnPrint)
        self.setLayout(vbox)
        self.resize(200, 100)

    def openFile(self):
        self.file = QtWidgets.QFileDialog.getOpenFileName(parent=self,
                    caption="Выберите графический файл",
                    filter="Графические файлы (*.bmp *.jpg *.png)")[0]

    def showPageOptions(self):
        pd = QtPrintSupport.QPageSetupDialog(self.printer, parent=self)
        pd.exec()

    def print(self):
        pd = QtPrintSupport.QPrintDialog(self.printer, parent=self)
        pd.setOptions(QtPrintSupport.QAbstractPrintDialog.PrintToFile |
                      QtPrintSupport.QAbstractPrintDialog.PrintSelection)
        if pd.exec() == QtWidgets.QDialog.Accepted:
            painter = QtGui.QPainter()
            painter.begin(self.printer)
            pixmap = QtGui.QPixmap(self.file)
            pixmap = pixmap.scaled(self.printer.width(),
                                   self.printer.height(),
                                   aspectRatioMode=QtCore.Qt.KeepAspectRatio)
            painter.drawPixmap(0, 0, pixmap)
            painter.end()

app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Архив с файлами можно взять здесь.

    На следующем шаге мы рассмотрим предварительный просмотр документов перед печатью.




Предыдущий шаг Содержание Следующий шаг