Поддержка печати Qt
Qt предоставляет обширную кроссплатформенную поддержку печати. Используя системные средства печати каждой платформы, приложения Qt могут печатать на подключённых принтерах и через сеть на удалённых принтерах. Система печати Qt также поддерживает генерацию PDF-файлов, предоставляя основу для основных возможностей генерации отчётов.
Классы, поддерживающие печать
Следующие классы поддерживают выбор и настройку принтеров и выходных данных печати.
Базовая реализация диалоговых окон печати, используемых для настройки принтеров |
|
Диалоговое окно настройки параметров страницы на принтере |
|
Диалоговое окно для указания настроек принтера |
|
Определяет интерфейс взаимодействия QPrinter с заданной системой печати |
|
Диалоговое окно для предварительного просмотра и настройки макета страницы для вывода на принтер |
|
Элемент управления для предварительного просмотра макета страницы для вывода на принтер |
|
Устройство отрисовки, которое рисует на принтере |
|
Предоставляет доступ к информации о существующих принтерах |
Устройства отрисовки и печать
В Qt принтеры представлены классом QPrinter, устройством отрисовки, которое предоставляет функциональность, специфичную для печати, такую как поддержка нескольких страниц и двустороннего вывода. В результате печать подразумевает использование QPainter для отрисовки на серии страниц так же, как вы бы рисовали на пользовательском виджете или изображении.
Создание QPrinter
Хотя объекты QPrinter можно создавать и настраивать без запроса пользователя, печать часто выполняется в результате запроса пользователя; например, при выборе пункта меню Файл|Печать... в приложении графического интерфейса. В таких случаях недавно созданный объект QPrinter передаётся в QPrintDialog, что позволяет пользователю указать используемый принтер, размер бумаги и другие свойства печати.
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setWindowTitle(tr("Print Document"));
if (editor->textCursor().hasSelection())
dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog.exec() != QDialog::Accepted) {
return;
} Также можно установить определённые значения по умолчанию, изменив QPrinter до его передачи в диалоговое окно печати. Например, приложения, которые генерируют партии отчётов для печати, могут настроить QPrinter на запись в локальный файл по умолчанию вместо принтера.
Отрисовка на странице
После создания и настройки объекта QPrinter, можно использовать QPainter для выполнения операций отрисовки на нём. Мы можем создать и настроить painter следующим образом:
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFileName("print.ps");
QPainter painter;
painter.begin(&printer);
for (int page = 0; page < numberOfPages; ++page) {
// Use the painter to draw on the page.
if (page != lastPage)
printer.newPage();
}
painter.end(); Поскольку QPrinter начинает с пустой страницы, нам нужно вызывать функцию newPage() после отрисовки каждой страницы, за исключением последней.
Документ отправляется на принтер или записывается в локальный файл, когда мы вызываем end().
Системы координат
QPrinter предоставляет функции для получения информации о размерах бумаги (прямоугольник бумаги) и размерах области печати (прямоугольник страницы). Эти значения задаются в логических координатах устройства, которые могут отличаться от физических координат, используемых самим устройством, что указывает на то, что принтер способен отображать текст и графику с разрешением (обычно более высоким), чем разрешение экрана пользователя.
Хотя нам не нужно самостоятельно обрабатывать преобразование между логическими и физическими координатами, нам всё равно нужно применять преобразования к операциям отрисовки, поскольку пиксельные измерения, используемые для отрисовки на экране, часто слишком малы для более высоких разрешений типовых принтеров.
|
Системы координат принтера и painter Функции paperRect() и pageRect() предоставляют информацию о размерах бумаги, используемой для печати, и области на ней, на которой можно рисовать. Прямоугольник, возвращаемый pageRect(), обычно находится внутри прямоугольника, возвращаемого paperRect(). Вам не нужно учитывать положение и размеры этих областей при использовании QPainter с QPrinter в качестве основного устройства отрисовки; начало системы координат painter будет совпадать с верхним левым углом прямоугольника страницы, и операции отрисовки будут обрезаны до границ печатаемой части страницы. |
Система отрисовки автоматически использует правильные метрики устройства при отрисовке текста, но если вам нужно позиционировать текст с использованием информации, полученной из метрик шрифта, необходимо убедиться, что устройство печати указано при создании объектов QFontMetrics и QFontMetricsF, или убедиться, что каждый используемый QFont создаётся с использованием формы конструктора, принимающего аргумент QPaintDevice.
Печать виджетов
Для печати виджета можно использовать функцию QWidget::render(). Как упоминалось, разрешение принтера обычно выше, чем разрешение экрана, поэтому вам придётся масштабировать painter. Вы также можете захотеть расположить виджет на странице. Следующий пример кода демонстрирует, как это может выглядеть.
QPainter painter;
painter.begin(&printer);
double xscale = printer.pageRect().width() / double(myWidget->width());
double yscale = printer.pageRect().height() / double(myWidget->height());
double scale = qMin(xscale, yscale);
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,
printer.paperRect().y() + printer.pageRect().height()/2);
painter.scale(scale, scale);
painter.translate(-width()/2, -height()/2);
myWidget->render(&painter); Это позволит центрировать виджет на странице и масштабировать его так, чтобы он поместился на странице.
Печать из сложных виджетов
Некоторые виджеты, такие как QTextEdit и QGraphicsView, отображают богатый контент, который обычно управляется экземплярами других классов, таких как QTextDocument и QGraphicsScene. В результате именно эти классы обработки контента обычно обеспечивают функциональность печати, либо через функцию, которая может выполняться для завершения задачи, либо через функцию, которая принимает существующий объект QPainter. Некоторые виджеты предоставляют удобные функции для доступа к внутренним функциям печати, что позволяет избежать необходимости получения обработчика контента только для вызова одной функции.
В следующей таблице показано, какой класс и какая функция отвечают за печать из выбранного набора различных виджетов. Для виджетов, которые не предоставляют функциональности печати напрямую, классы обработки контента, содержащие эту функциональность, можно получить через функцию в API соответствующего виджета.
| Виджет | Функция печати | Принимает |
|---|---|---|
| QGraphicsView | QGraphicsView::render() | QPainter |
| QSvgWidget | QSvgRenderer::render() | QPainter |
| QTextEdit | QTextDocument::print() | QPrinter |
| QTextLayout | QTextLayout::draw() | QPainter |
| QTextLine | QTextLine::draw() | QPainter |
QTextEdit требует QPrinter, а не QPainter, потому что он использует информацию о конфигурируемых размерах страницы, чтобы вставлять разрывы страниц в наиболее подходящих местах в печатных документах.
Лицензии и товарные знаки
Модуль Поддержка печати Qt доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения. Начиная с Qt 5.4, эти лицензии свободного программного обеспечения являются GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Дополнительные сведения см. в разделе Лицензирование Qt.
Обратите внимание, что Adobe® устанавливает ограничения на использование своих товарных знаков (включая логотипы) в сочетании с PDF; например, «Adobe PDF». Сведения об указаниях см. на сайте www.adobe.com.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qtprintsupport-index.html