Spec-Zone.ru › Qt 6.0

Поддержка печати 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 += printsupport

Эволюция модуля

Изменения в модуле Поддержки печати Qt перечисляет важные изменения в API модуля и функциональности, выполненные для серии Qt 6.

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

Модуль Поддержки печати Qt доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: по GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Дополнительные сведения см. в Qt Licensing.

Обратите внимание, что 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.0/qtprintsupport-index.html

Spec-Zone.ru

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