Я обновляю код 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 файлов.