Поддержка печати Qt
Модуль Поддержки печати Qt предоставляет обширную кроссплатформенную поддержку печати. Используя системы печати каждой платформы, приложения Qt могут печатать на подключенных принтерах и по сетям на удалённых принтерах. Система печати также поддерживает генерацию PDF-файлов, обеспечивая основу для базовых средств генерации отчётов.
Поддержка печати Qt недоступна на iOS.
Классы, поддерживающие печать
Следующие классы поддерживают выбор и настройку принтеров и вывод на печать.
Базовая реализация диалоговых окон печати, используемых для настройки принтеров |
|
Представляет собой коллекцию диапазонов страниц |
|
Диалоговое окно настроек страниц для параметров принтера |
|
Диалоговое окно для указания настроек принтера |
|
Определяет интерфейс взаимодействия QPrinter с заданной системой печати |
|
Диалоговое окно для предварительного просмотра и настройки макетов страниц для вывода на печать |
|
Виджет для предварительного просмотра макетов страниц для вывода на печать |
|
Устройство рисования, которое рисует на принтере |
|
Предоставляет доступ к информации о существующих принтерах |
Устройства рисования и печать
Принтеры представлены классом 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 может использоваться для выполнения операций рисования на нём. Мы можем создать и настроить рисовальщик следующим образом:
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 предоставляет функции для получения информации о размерах бумаги (прямоугольник бумаги) и размерах области печати (прямоугольник страницы). Эти значения заданы в логических координатах устройства, которые могут отличаться от физических координат, используемых самим устройством, указывая, что принтер может отображать текст и графику с разрешением, как правило, выше, чем разрешение экрана пользователя.
Хотя нам не нужно самостоятельно обрабатывать преобразование между логическими и физическими координатами, нам всё равно нужно применять преобразования к операциям рисования, потому что пиксельные измерения, используемые для рисования на экране, часто слишком малы для более высокого разрешения типичных принтеров.
|
Системы координат принтера и рисовальщика Функции paperRect() и pageRect() предоставляют информацию о размере бумаги, используемой для печати, и области на ней, по которой можно рисовать. Прямоугольник, возвращаемый функцией pageRect(), обычно находится внутри прямоугольника, возвращаемого функцией paperRect(). Вам не нужно учитывать расположение и размеры этих областей при использовании QPainter с QPrinter в качестве базового устройства рисования; начало системы координат рисовальщика совпадёт с верхним левым углом прямоугольника страницы, а операции рисования будут обрезаны до границ рисуемой части страницы. |
Система рисования автоматически использует правильные метрики устройства при рисовании текста, но если вам нужно размещать текст, используя информацию, полученную из метрик шрифта, вам нужно убедиться, что устройство печати указано при создании объектов QFontMetrics и QFontMetricsF, или убедиться, что каждый используемый объект QFont создаётся с использованием формы конструктора, принимающего аргумент QPaintDevice.
Печать виджетов
Для печати виджета можно использовать функцию QWidget::render(). Как упоминалось ранее, разрешение принтера, как правило, выше, чем разрешение экрана, поэтому вам придётся масштабировать рисовальщик. Вы также можете захотеть разместить виджет на странице. Следующий фрагмент кода показывает, как это может выглядеть.
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 требует линковки с библиотекой модуля, либо непосредственно, либо через другие зависимости. Несколько инструментов сборки имеют специальную поддержку этого, включая CMake и qmake.
Сборка с помощью CMake
Используйте команду find_package() для поиска необходимых компонентов модуля в пакете Qt6.
find_package(Qt6 COMPONENTS PrintSupport REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)
См. также обзор Сборка с помощью CMake.
Сборка с помощью qmake
Для настройки модуля для сборки с помощью qmake добавьте модуль в качестве значения переменной QT в файле проекта .pro:
QT += printsupport
Эволюция модуля
Изменения в модуле поддержки печати Qt перечисляет важные изменения в API и функциональности модуля, которые были внесены для серии Qt 6.
Лицензии и товарные знаки
Модуль Поддержки печати Qt доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: Лицензия GNU Lesser General Public, версия 3, или Лицензия GNU General Public, версия 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-6.2/qtprintsupport-index.html