如何将QQuickView的内容打印成PDF?

tim*_*day 13 qt pdf-generation qt-quick qt5 qtquick2

我正在将一些Qt(C++和QML)代码从Qt4.8升级到Qt5.1.

Qt4.8代码是一个简单的C++"QML查看器"应用程序子类化a QDeclarativeView和一堆QML.

QQuickView除了一件事之外,很容易将其更改为使用Qt5/QtQuick2 :

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);
}
Run Code Online (Sandbox Code Playgroud)

Qt5.1需要进行一些"环境"更改才能获得QPrinter(即添加QT += printsupport到项目.pro文件中#include <QtPrintSupport>),但似乎有一个更基本的问题,QQuickView它不提供任何明显与QGraphicsView/ 兼容的东西.QPainter/ QPaintDeviceworld of QPrinter(具体来说,QQuickView没有render方法,所有绘图/绘画/渲染相关的方法看起来与OpenGL非常相关).

有关如何从中获得高质量PDF输出的任何建议QQuickView

(请注意,我not只是希望截图的视图;与QDeclarativeView上面的代码生成的PDF文件与很多更好的分辨率甚至超过了应用程序全屏我最大的显示器上).

我看到"将QML应用程序移植到Qt 5"指南中的"QDeclarativeItem和QDeclarativeView"部分确实提到了QGraphicsView特定功能的丢失,但没有提供任何解决方案(尽管它确实提到了带有自定义项目的工作场所QPainter-基础渲染被买入新政权).

更新一些额外的背景信息:可以在此处找到使用上述代码从QDeclarativeView打印的PDF示例.有一个体面的大小监视器上相同的观点的PNG 这里.(这实际上是一系列幻灯片中的最后一张幻灯片;它实际上是以前幻灯片的一个画廊,它将每张幻灯片反弹到屏幕上;如果我有时间,我会考虑画廊的可行性是唯一的改变每个分散的幻灯片进入Prezi风格的演示视图;怀疑QDeclarative虽然不够真实,这是想要进入QtQuick2 + Qt5.2的新场景图形的一个原因).无论如何,如果你将PDF缩放到100%,你会看到文本是...好吧,它比任何一个大小合适的图像文件管理我认为,尽管倾斜的文本基线可能看起来有点不均匀.还有一个问题,不透明度值没有在PDF中表示(因此阴影和"气泡"变得坚固); 我尝试QtQuick2版本的另一个动机实际上是看看半透明元素是否得到了更好的处理.我假设PDF只包含所有元素的栅格化(或可能是矢量轮廓),因为像"pdftotext"这样的实用程序无法从中提取任何内容.我不太了解PDF工具知道如何检查事物的内部结构,但我假设那里有一些层次结构,QML元素树全部使用类似的嵌套变换结构到QML.只需进行比较和排序丰富,我可能对工作的这里的海报我乳胶/ Beamerposter做; 我发现Beamerposter的刚性块结构与QML似乎提供的可能性相比有限(并且非常繁琐).顺便说一下,我的心愿单/ todolist上的另一件事是一个QML元素,可以渲染LaTeX源码,数学和所有,只是为了获得两全其美.

更新:Qt5.8中所有后端更改的最新Qt博客文章都有一个链接到此Qt问题的注释,以使用QPainter渲染的QtQuick场景渲染PDF的新可能性.

Rei*_*ica 2

目前,Qt 中没有代码支持将场景图渲染为 pdf。用于渲染 Qt Quick 2 的基础数据保存在场景图中。正如 Laszlo 所建议的,您需要迭代场景图并生成 PDF 基元。那里存在一些阻抗不匹配,但应该可以通过一些努力来实现。我认为概念证明可能足够小,可以容纳在这里,所以我会看看它有多容易:)

如果您确实想要 PDF,目前您别无选择,只能将其渲染为 300dpi 的大图像并将其包装在 PDF 中。如果海报有大面积的纯色,则图像不必很大。PDF 可以进行 TIFF 编码,也可以进行 JPEG 编码。