我正在将一些Qt(C ++和QML)代码从Qt4.8升级到Qt5.1。
Qt4.8代码是一个简单的C ++“QML查看器”应用程序,它继承了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
世界兼容的任何内容(具体而言,{ {1}}没有QQuickView
方法,并且它所做的所有绘图/绘画/渲染相关方法似乎都与OpenGL密切相关。
有关如何从render
获得高质量PDF输出的任何建议?
(请注意,我QQuickView
只是想截取视图;使用not
,上面的代码生成的PDF文件很多分辨率比我在我的最大的监视器)。
我看到"Porting QML Applications to Qt 5"指南的“QDeclarativeItem和QDeclarativeView”部分确实提到了QDeclarativeView
特定功能的丢失,但没有提供任何解决方案(尽管它确实提到了案例的工作原理)基于自定义QGraphicsView
的渲染项目被购买到新政权中。)
更新以及一些其他背景信息:可以找到使用上述代码从QDeclarativeView打印的PDF示例here。在体面的监视器here上有一个相同的视图。 (这实际上是一系列幻灯片中的最后一张幻灯片;它实际上是以前幻灯片的一个画廊,它将每张幻灯片反弹到屏幕上;如果我有时间,我会考虑画廊的可行性仅为 事物并将每个分散的幻灯片转换为Prezi风格的演示文稿;怀疑QDeclarative虽然不够高效,但这是想要进入QtQuick2 + Qt5.2的新场景图的一个原因东西)。无论如何,如果你将PDF缩放到100%,你会看到文本是...好吧,它比任何一个大小合适的图像文件管理我认为,尽管倾斜的文本基线可能看起来有点不均匀。还有一个问题,不透明度值没有在PDF中表示(因此阴影和“气泡”变得坚固);我尝试QtQuick2版本的另一个动机实际上是看看半透明元素是否得到了更好的处理。我假设PDF只包含所有元素的栅格化(或可能是矢量轮廓),因为像“pdftotext”这样的实用程序无法从中提取任何内容。我不太了解PDF工具知道如何检查事物的内部结构,但我认为那里有一些层次结构,QML元素树全部使用类似的嵌套变换结构到QML。只是为了比较和丰富,我可能正在努力here's我用LaTeX / Beamerposter做的海报;我发现Beamerposter的刚性块结构相当于限制(和fiddly)与QML似乎提供的可能性相比。顺便说一句,我的愿望清单/ todolist上的另一件事是QML element which can render LaTeX source,数学和所有,只是为了获得两全其美。
更新:Qt5.8中所有后端更改的最新Qt blog post都有一条链接到this Qt issue的注释,以使用QPainter呈现的QtQuick场景的新可能性进行渲染PDF文件。
答案 0 :(得分:2)
目前,Qt中没有支持将场景图呈现为pdf的代码。用于渲染Qt Quick 2的基础数据保存在场景图中。正如Laszlo建议的那样,您需要迭代场景图并生成PDF原语。那里有一些阻抗不匹配,但它应该可以用一些汗水。我认为概念证明可以小到足以适应这里,所以我会看到它有多容易:)
如果您真的想要PDF,那么您目前别无选择,只能将其渲染为300dpi的大图像并将其包装在PDF中。如果海报具有大面积的纯色,则图像不必很大。 PDF可以做TIFF编码和JPEG编码。