Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница69 из 83
1   ...   65   66   67   68   69   70   71   72   ...   83

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([, parent=None])
Первый формат создает диалоговое окно, привязанное к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса
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([, parent=None][, flags=0])
Первый формат создает диалоговое окно, привязанное к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса
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([, parent=None][, flags=0])
Первый формат создает компонент, привязанный к используемому по умолчанию принтеру, второй формат позволяет указать нужный нам принтер в виде экземпляра класса
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()
— возвращает установленный по умолчанию размер бумаги в виде экземпляра класса
1   ...   65   66   67   68   69   70   71   72   ...   83


написать администратору сайта