ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
• PrintCollateCopies — 16 — указание режима печати копий документов (будет ли каждая копия печататься полностью, или сначала будут отпечатаны все копии первой страницы, потом — копии второй и т. д.); • PrintCurrentPage — 64 — указание печати только текущей страницы; setOptions(<Настройки принтера>) — позволяет активизировать сразу несколько на- строек принтера; testOption(<Настройка принтера>) — возвращает True , если заданная настройка прин- тера активизирована, и False — в противном случае; options() — возвращает комбинацию значений атрибутов класса QAbstractPrintDialog через оператор |, которые представляют активизированные настройки; printer() — возвращает принтер (экземпляр класса QPrinter ), выбранный в диалоговом окне. 29.2.2. Класс QPageSetupDialog Класс QPageSetupDialog реализует работу стандартного диалогового окна установки пара- метров страницы: размера, ориентации, отступов и др. Воочию его можно увидеть на рис. 29.2. Рис. 29.2. Стандартное диалоговое окно установки параметров страницы Глава 29. Печать документов 715 Иерархия наследования этого класса: (QObject, QPaintDevice) — QWidget — QDialog – QPageSetupDialog Конструктор класса QPageSetupDialog имеет следующий формат: <Объект> = QPageSetupDialog([parent=None]) <Объект> = QPageSetupDialog( Первый формат создает диалоговое окно, привязанное к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса QPrinter . Необязательный параметр parent может быть использован для задания родителя. Принципы работы с диалоговым окном параметров страницы такие же, как и у его «колле- ги», представляющего параметры принтера (см. разд. 29.2.1): мы задаем нужные параметры страницы, вызывая соответствующие методы класса QPrinter , и выводим диалоговое окно на экран вызовом метода exec() или exec_() . И, опять же, все заданные в этом диалоговом окне настройки будут применены к принтеру автоматически. Из поддерживаемых классом QPageSetupDialog методов нас может заинтересовать разве что printer() . Он возвращает принтер (экземпляр класса QPrinter ), указанный в вызове конст- руктора. Практиковаться мы станем на утилите печати изображений, которую сейчас же и напишем. Ее интерфейс очень прост и включает лишь кнопки открытия файла, вывода диалоговых окон настройки принтера и параметров страницы и собственно печати (листинг 29.4). Листинг 29.4. Использование классов QPrintDialog и QPageSetupDialog 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) 716 Часть II. Библиотека PyQt 5 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_()) 29.3. Предварительный просмотр документов перед печатью Еще одна возможность, предоставляемая серьезными приложениями, — предварительный просмотр документа перед собственно печатью. В PyQt 5 реализовать это проще простого. 29.3.1. Класс QPrintPreviewDialog Класс QPrintPreviewDialog выводит документ в стандартном диалоговом окне предвари- тельного просмотра (рис. 29.3). Иерархия наследования этого класса: (QObject, QPaintDevice) — QWidget — QDialog – QPrintPreviewDialog Конструктор класса QPrintPreviewDialog имеет следующий формат: <Объект> = QPrintPreviewDialog([parent=None][, flags=0]) <Объект> = QPrintPreviewDialog( Первый формат создает диалоговое окно, привязанное к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса QPrinter . Необязательный параметр parent может быть использован для задания родителя, а необязательный параметр flags — для установки типа окна (см. разд. 18.2). Глава 29. Печать документов 717 Рис. 29.3. Стандартное диалоговое окно предварительного просмотра документа Вывод документа для предварительного просмотра с помощью класса QPrintPreviewDialog выполняется в три этапа: 1. Создание экземпляра класса QPrintPreviewDialog 2. Назначение сигналу paintRequested( этого экземпляра обработчика, внутри которого и будет выполняться вывод документа. Как видим, обработчику сигнала в па- раметре передается указанный в вызове конструктора принтер, так что вывести доку- мент мы сможем без труда. 3. Вывод диалогового окна на экран вызовом метода exec() или exec_() экземпляра класса QPrintPreviewDialog Переделаем утилиту печати изображений, чей код приведен в листинге 29.4, таким образом, чтобы дать пользователю возможность просматривать изображения перед печатью. Ис- правленный код можно увидеть в листинге 29.5 — поскольку переделки здесь довольно значительные, авторы привели его целиком. Листинг 29.5. Использование класса QPrintPreviewDialog from PyQt5 import QtCore, QtWidgets, QtGui, QtPrintSupport import sys class MyWindow(QtWidgets.QWidget): def __init__(self, parent = None): 718 Часть II. Библиотека PyQt 5 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) btnPreview = QtWidgets.QPushButton("П&росмотр...") btnPreview.clicked.connect(self.preview) vbox.addWidget(btnPreview) 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 preview(self): pp = QtPrintSupport.QPrintPreviewDialog(self.printer, parent=self) pp.paintRequested.connect(self._printImage) pp.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: self._printImage(self.printer) def _printImage(self, printer): painter = QtGui.QPainter() painter.begin(printer) pixmap = QtGui.QPixmap(self.file) pixmap = pixmap.scaled(printer.width(), printer.height(), aspectRatioMode=QtCore.Qt.KeepAspectRatio) painter.drawPixmap(0, 0, pixmap) painter.end() Глава 29. Печать документов 719 app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_()) Как видно из рис. 29.3, диалоговое окно предварительного просмотра дает возможности перехода со страницы на страницу, масштабирования выведенного документа, указания режима его вывода (постранично, по две страницы и т. п.), задания ориентации страницы, вызова диалогового окна настроек страницы, а также отправки документа на печать. 29.3.2. Класс QPrintPreviewWidget Класс QPrintPreviewWidget представляет отдельный компонент — панель для предвари- тельного просмотра документа. Ее можно воспринимать как центральную часть рассмот- ренного нами в предыдущем разделе диалогового окна. Иерархия наследования этого класса: (QObject, QPaintDevice) — QWidget — QPrintPreviewWidget Конструктор класса QPrintPreviewWidget имеет следующий формат: <Объект> = QPrintPreviewWidget([parent=None][, flags=0]) <Объект> = QPrintPreviewWidget( Первый формат создает компонент, привязанный к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса QPrinter Необязательный параметр parent может быть использован для задания родителя, а необяза- тельный параметр flags — для установки типа окна (см. разд. 18.2). Последовательность действий, необходимых для реализации предварительного просмотра с помощью класса QPrintPreviewWidget , почти такая же, что и в случае класса QPrintPreviewDialog : мы создаем экземпляр класса QPrintPreviewWidget , назначаем для его сигнала paintRequested() обработчик и пишем в этом обработчике код, который и выпол- нит вывод документа. Класс QPrintPreviewWidget поддерживает ряд методов, предназначенных для выполнения различных действий над выведенным в панели документом. Рассмотрим их: setOrientation(<Ориентация>) — задает ориентацию страницы в виде значения атрибута Portrait ( 0 , портретная) или Landscape ( 1 , ландшафтная) класса QPrinter . Метод являет- ся слотом; setPortraitOrientation() — задает портретную ориентацию страницы. Метод является слотом; setLandscapeOrientation() — задает ландшафтную ориентацию страницы. Метод явля- ется слотом; orientation() — возвращает ориентацию страницы; setViewMode(<Режим просмотра>) — задает режим просмотра страниц документа в виде значения одного из следующих атрибутов класса QPrintPreviewWidget : • SinglePageView — 0 — постраничный режим (одновременно выводится только одна страница); 720 Часть II. Библиотека PyQt 5 • FacingPagesView — 1 — режим просмотра разворота (одновременно отображаются две страницы); • AllPagesView — 2 — выводятся сразу все страницы документа. Метод является слотом; setSinglePageViewMode() — задает постраничный режим просмотра страниц. Метод является слотом; setFacingPagesViewMode() — задает режим просмотра разворота. Метод является сло- том; setAllPagesViewMode() — задает режим просмотра всех страниц документа. Метод явля- ется слотом; viewMode() — возвращает обозначение режима просмотра страниц; setZoomMode(<Режим масштабирования>) — задает режим масштабирования страниц при просмотре в виде значения одного из следующих атрибутов класса QPrintPreviewWidget : • CustomZoom — 0 — произвольное масштабирование со значением масштаба заданным методом setZoomFactor() ; • FitToWidth — 1 — выбирается такое значение масштаба, чтобы страница помещалась в панели по ширине; • FitInView — 2 — выбирается такое значение масштаба, чтобы страница помещалась в панели полностью. Метод является слотом; fitToWidth() — задает такой режим масштабирования, чтобы страница помещалась в панели по ширине. Метод является слотом; fitInView() — задает такой режим масштабирования, чтобы страница помещалась в панели полностью. Метод является слотом; zoomMode() — возвращает обозначение режима масштабирования страниц; setZoomFactor(<Масштаб>) — задает значение масштаба для выводимого в панели доку- мента в виде вещественного числа при условии, что указан режим масштабирования CustomZoom . Значение 1.0 задает изначальный масштаб, меньшие значения уменьшают его, а бо́льшие — увеличивают. Метод является слотом; zoomIn([<Масштаб>]) — задает новый масштаб документа, увеличивая его. Если масштаб не задан, будет использовано значение 1.1 . Метод является слотом; zoomOut([<Масштаб>]) — задает новый масштаб документа, уменьшая его. Если масштаб не задан, будет использовано значение 1.1 . Метод является слотом; zoomFactor() — возвращает значение масштаба; pageCount() — возвращает общее количество страниц в документе; setCurrentPage(<Номер страницы>) — задает номер страницы, выводимой в панели. Ме- тод является слотом; currentPage() — возвращает номер страницы, выводящейся в панели в данный момент; updatePreview() — выполняет обновление содержимого панели. При этом будет снова сгенерирован сигнал paintRequested() . Метод является слотом; Глава 29. Печать документов 721 print() — выполняет печать документа, отображающегося в панели, с выводом на экран диалогового окна выбора и настройки принтера. Метод является слотом. В дополнение к paintRequested() , класс QPrintPreviewWidget поддерживает сигнал previewChanged() . Он генерируется при изменении параметров панели просмотра: ориента- ции страницы, режима просмотра, масштаба и др. 29.4. Класс QPrinterInfo: получение сведений о принтере Очень полезный класс QPrinterInfo позволяет получить сведения как обо всех установлен- ных в системе принтерах, так и о конкретном принтере, указанном нами. Форматы вызова его конструктора следующие: <Объект> = QPrinterInfo( <Объект> = QPrinterInfo( Второй формат создает копию экземпляра класса QPrinterInfo , переданного в параметре. Класс QPrinterInfo поддерживает следующие методы: availablePrinters() — возвращает список всех установленных в системе принтеров, представленных экземплярами класса QPrinterInfo . Метод является статическим; availablePrinterNames() — возвращает список имен всех установленных в системе принтеров, заданных строками: l = QtPrintSupport.QPrinterInfo.availablePrinterNames() for p in l: print(p) Выведет: Microsoft XPS Document Writer Microsoft Print to PDF Fax Canon iP2800 series Метод является статическим; defaultPrinter() — возвращает сведения о принтере, используемом по умолчанию, в виде экземпляра класса QPrinterInfo . Метод является статическим; defaultPrinterName() — возвращает имя принтера, используемого по умолчанию: print(QtPrintSupport.QPrinterInfo.defaultPrinterName()) Выведет: Canon iP2800 series Метод является статическим; printerInfo(<Имя принтера>) — возвращает экземпляр класса QPrinterInfo , хранящий сведения о принтере с указанным именем. Если такого принтера нет, возвращается некорректный, «пустой» экземпляр класса: p = QtPrintSupport.QPrinterInfo.printerInfo("Canon iP2800 series") Метод является статическим; isNull() — возвращает True , если экземпляр объекта указывает на конкретный установ- ленный в системе принтер, и False , если он является «пустым»; 722 Часть II. Библиотека PyQt 5 printerName() — возвращает имя принтера; makeAndModel() — возвращает развернутое наименование принтера с указанием его из- готовителя, если таковые сведения имеются в наличии, или просто имя принтера — в противном случае; description() — возвращает развернутое описание принтера, если таковое имеется в наличии, или просто имя принтера — в противном случае; location() — возвращает указание на местоположение принтера, если таковое имеется в наличии, или пустую строку — в противном случае; isDefault() — возвращает True , если принтер помечен как используемый по умолча- нию, и False — в противном случае; isRemote() — возвращает True , если это сетевой принтер, и False , если он локальный; state() — возвращает текущее состояние принтера в виде значения одного из следую- щих атрибутов класса QPrinter : • Idle — 0 — простаивает; • Active — 1 — идет печать; • Aborted — 2 — печать была прервана; • Error — 3 — возникла ошибка; supportedPageSizes() — возвращает список поддерживаемых принтером размеров бу- маги, представляемых экземплярами класса QPageSize ; supportsCustomPageSizes() — возвращает True , если принтер поддерживает указание произвольного размера бумаги, и False — в противном случае; supportedResolutions() — возвращает список разрешений, поддерживаемых принтером и измеряемых в точках на дюйм; supportedDuplexModes() — возвращает список поддерживаемых принтером режимов двусторонней печати. Каждый элемент списка является значением одного из атрибутов класса QPrinter , приведенных в описании метода setDuplex() (см. разд. 29.1.1); defaultPageSize() — возвращает установленный по умолчанию размер бумаги в виде экземпляра класса |