Spec-Zone.ru › Qt 6.1

Поддержка печати Qt

Модуль Поддержка печати Qt предоставляет обширную кроссплатформенную поддержку печати. Используя системы печати каждой платформы, приложения Qt могут печатать на подключенных принтерах и по сети на удаленных принтерах. Система печати также поддерживает генерацию PDF-файлов, предоставляя основу для базовых возможностей генерации отчётов.

Классы, поддерживающие печать

Следующие классы поддерживают выбор и настройку принтеров и вывод на печать.

QAbstractPrintDialog

Базовая реализация диалогов печати, используемых для настройки принтеров

QPageRanges

Представляет коллекцию диапазонов страниц

QPageSetupDialog

Диалоговое окно настройки параметров страниц на принтере

QPrintDialog

Диалоговое окно для указания конфигурации принтера

QPrintEngine

Определяет интерфейс взаимодействия QPrinter с данной системой печати

QPrintPreviewDialog

Диалоговое окно для предварительного просмотра и настройки макета страниц для вывода на принтер

QPrintPreviewWidget

Виджет для предварительного просмотра макета страниц для вывода на принтер

QPrinter

Устройство рисования, которое рисует на принтере

QPrinterInfo

Предоставляет доступ к информации о существующих принтерах

Устройства рисования и печать

Принтеры представляются с помощью 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 перечисляет важные изменения в API и функциональности модуля, которые были внесены для серии Qt 6.

Лицензии и товарные знаки

Модуль Поддержка печати Qt доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: 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-6.1/qtprintsupport-index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API