На этом шаге мы рассмотрим назначение, форматы конструктора и основные методы этого класса, а также приведем пример использования его и ранее рассмотренных классов.
Класс 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_())
На следующем шаге мы рассмотрим предварительный просмотр документов перед печатью.