Как распечатать содержимое QQuickView в PDF? - программирование
Подтвердить что ты не робот

Как распечатать содержимое QQuickView в PDF?

Я обновляю код Qt (С++ и QML) от Qt4.8 до Qt5.1.

Код Qt4.8 - это тривиальное приложение С++ "QML viewer", подклассическое QDeclarativeView и куча QML.

Достаточно легко было изменить это, чтобы использовать Qt5/QtQuick2 QQuickView, за исключением одного:

В приложении Qt4.8 есть метод для печати в формате PDF:

void MyQMLViewer::printToPDF(const QString& filename) const {
  QPrinter printer(QPrinter::HighResolution);
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setPageSize(QPrinter::A3);
  printer.setOutputFileName(filename);
  printer.setOrientation(QPrinter::Landscape);
  QPainter painter(&printer);
  render(&painter);
}

Для Qt5.1 потребовалось несколько изменений "среды", чтобы получить QPrinter (т.е. добавить QT += printsupport в файл проекта .pro и #include <QtPrintSupport>), но, похоже, существует более фундаментальная проблема, которая QQuickView не предоставляет ничего, что, очевидно, совместимо с миром QGraphicsView/QPainter/QPaintDevice QPrinter (в частности, QQuickView не имеет метода render, и все чертежи/связанные с рендерингом методы, которые, похоже, очень привязаны к OpenGL).

Любые предложения о том, как наилучшим образом получить высококачественный PDF-вывод из QQuickView?

(Обратите внимание, что я not просто смотрю на скриншот представления, а QDeclarativeView, код выше создает PDF файлы с гораздо лучшим разрешением, даже если приложение полноэкранное на моем самом большом мониторе).

Я вижу раздел "QDeclarativeItem и QDeclarativeView" в "Портирование QML-приложений в Qt 5" в руководстве упоминается потеря QGraphicsView, но не предлагает каких-либо решений (хотя он упоминает workrounds для случая, когда элементы с пользовательским рендерингом QPainter приобретаются в новом режиме).

Обновить с дополнительной дополнительной информацией: пример PDF, напечатанный из QDeclarativeView с использованием вышеуказанного кода, можно найти здесь. Там png такой же точки зрения на достойном мониторе размера здесь. (На самом деле это последний слайд в серии слайдов, на самом деле это галерея предыдущих слайдов, которые отскакивают от каждого слайда на экране, и если бы у меня было время, я бы рассмотрел возможность того, что галерея является единственной вещью и преобразует каждый разбросанный слайд в поле зрения Prezi - презентация в стиле, подозрительный QDeclarative недостаточно эффективен, хотя это одна из причин желания чтобы попасть в QtQuick2 + Qt5.2 новый сюжетный график). Во всяком случае, если вы увеличите размер PDF до 100%, вы увидите, что текст... ну это лучше, чем что-либо, файл управления размером со стандартным размером, я думаю, хотя наклонные исходные тексты могут выглядеть немного неравномерно. Существует также проблема с значениями непрозрачности, которые не представлены в PDF (поэтому тени и "пузыри" выходят прочно); еще одна из моих мотивов для попытки версии QtQuick2 заключалась в том, чтобы увидеть, были ли полупрозрачные элементы обработаны лучше. Я полагаю, что PDF просто содержит растрированные (или, возможно, векторные контуры) все элементы, так как утилиты, такие как "pdftotext", не могут извлечь из него ничего. Я не знаю достаточно о инструментах PDF, чтобы знать, как проверять внутреннюю структуру объекта, но я предполагаю, что там есть иерархия, и все элементы дерева элементов QML выложены с использованием аналогичной структуры вложенных преобразований в QML. Просто для сравнения и своего рода богатства я потенциально работаю над вот плакат, который я сделал с LaTeX/Beamerposter; Я считаю, что жесткая блочная структура Beamerposter довольно ограничена (и fiddly) по сравнению с возможностями QML, которые, как представляется, предлагают. BTW, еще одна вещь в моем списке пожеланий /todolist - это элемент QML, который может отображать источник LaTeX, математику и все, чтобы получить лучшее из обоих миров.

Обновление. Недавнее Сообщение в блоге Qt о всех изменениях в базе данных в Qt5.8 содержит комментарий, связанный с эта проблема Qt, чтобы использовать новую возможность для QtQuick-рендеринга QPainter для рендеринга PDF файлов.

4b9b3361

Ответ 1

На данный момент в Qt нет кода, который поддерживает рендеринг графа сцены в pdf. Основные данные, которые используются для рендеринга Qt Quick 2, хранятся на графике сцены. Как предполагает Ласло, вам нужно будет итерировать граф сцены и создать примитивы PDF. Там некоторая импеданс несоответствие там, но это должно быть выполнимо с некоторым потом. Я думаю, что доказательство концепции может быть достаточно маленьким, чтобы соответствовать этому, поэтому я посмотрю, как легко это может быть:)

Если вам действительно нужен PDF файл, у вас нет выбора, кроме как сделать его большим изображением с разрешением 300 точек на дюйм и обернуть его в PDF файле. Изображение не должно быть большим, если плакат имеет большие области сплошного цвета. PDF может делать кодировку TIFF, а также кодирование JPEG.