gpt4 book ai didi

qt - 如何将 QQuickView 的内容打印为 PDF?

转载 作者:行者123 更新时间:2023-12-03 22:43:34 25 4
gpt4 key购买 nike

我正在将一些 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 (具体来说, QQuickView 没有 render 方法,而且它确实有的所有绘图/绘画/渲染相关的方法似乎都与 OpenGL 紧密相关)。

关于如何最好地从 QQuickView 获得高质量 PDF 输出的任何建议?

(请注意,我是 not 只是想截取 View ;使用 QDeclarativeView,上面的代码生成的 PDF 分辨率甚至比我最大的显示器上全屏显示的应用程序要好得多)。

我看到 "Porting QML Applications to Qt 5" 的“QDeclarativeItem 和 QDeclarativeView”部分指南确实提到了 QGraphicsView的损失-特定的功能,但不提供任何解决方案(尽管它确实提到了针对具有自定义 QPainter 的基于渲染的项目被购买到新制度的情况的解决方法)。

更新 带有一些额外的背景信息:可以找到使用上述代码从 QDeclarativeView 打印的 PDF 示例 here .在合适尺寸的显示器上有一个相同 View 的 png here . (这实际上是一系列幻灯片中的最后一张幻灯片;它实际上是前几张幻灯片的画廊,将每张幻灯片弹到屏幕上;如果我有时间,我会研究一下画廊是唯一的可行性并进行转换每个分散的幻灯片都显示为 Prezi 风格的演示文稿;但怀疑 QDeclarative 的性能确实不够好,这是想要使用 QtQuick2+Qt5.2 的新场景图内容的一个原因)。无论如何,如果你将 PDF 放大到 100%,你会看到文本是......好吧,我认为它比大小合理的图像文件管理的任何东西都要好,尽管倾斜的文本基线可能看起来有点不均匀。还有一个问题是不透明度值没有在 PDF 中表示(所以阴影和“气泡”是实心的);我尝试 QtQuick2 版本的另一个动机实际上是想看看半透明元素是否得到更好的处理。我假设 PDF 只包含所有元素的光栅化(或者可能是矢量轮廓),因为像“pdftotext”这样的实用程序无法从中提取任何内容。我对 PDF 工具的了解不够,无法了解如何检查事物的内部结构,但我假设那里有一些层次结构,并且 QML 元素树都使用与 QML 类似的嵌套转换结构进行布局。只是为了比较和我可能正在努力的那种丰富性 here's我用 LaTeX/Beamposter 做的一张海报;我发现与 QML 似乎提供的可能性相比,Beamerposter 的刚性块结构相当有限(和 fiddly)。顺便说一句,我的愿望 list /待办事项 list 上的另一件事是 QML element which can render LaTeX source ,数学等等,只是为了两全其美。

更新 : 近期 Qt blog post关于 Qt5.8 中所有后端更改的注释链接到 this Qt issue使用 QPainter 渲染的 QtQuick 场景的新可能性来渲染 PDF。

最佳答案

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

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

关于qt - 如何将 QQuickView 的内容打印为 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com