QSvgGenerator在生成Svg时将QSvgGraphicsItem转换为图像

2024-07-03

我有一堆 SVG 文件,我已将它们(作为 QGraphicsSvgItem)加载到 QGraphicsScene 中进行设计,一切都很好,现在我想使用 QSvgGenerator 将场景保存到另一个输出 SVG 文件(包括所有 Svg 项目)中代码如下,但是当它导出 SVG 项目时,它们会变成输出文件中的图像,并且它们的矢量不再可缩放。

如果这个 Qt 框架没有直接的解决方案,我期待 XML 操作方法。

QSvgGenerator generator;
generator.setFileName(savePath);
generator.setSize(QSize(static_cast<int>(currentScene->width()), static_cast<int>(currentScene->height())));
generator.setViewBox(currentScene->sceneRect());
generator.setTitle(tr("SVG Generated using SVG Generator"));
generator.setDescription(tr("an SVG drawing used by Software Package"));
QPainter painter;
painter.begin(&generator);
currentScene->clearSelection();
currentScene->render(&painter);
painter.end();

我期待一个输出 svg 文件,其中包含内部 SVG 项目的标签和节点(不将它们转换为图像数据)

现在它正在将内部 svg 项目转换为这些图像标签:

<image x="131" y="127" width="102" height="102" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

UPDATE 1这个小应用程序将在图形场景中显示一个 svg 文件 (QGraphicsSvgItem),并将使用 QSvgGenerator 将场景导出到另一个输出 svg 文件中:

#include <QApplication>
#include <QtSvg>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Creating and showing an svg icon in the graphical scene view
    QGraphicsSvgItem *item = new QGraphicsSvgItem(":The Pirate Bay Logo.svg");
    QGraphicsScene *scene = new QGraphicsScene;
    scene->setSceneRect(0, 0, 1000, 1000);
    QGraphicsView *view = new QGraphicsView(scene);

    scene->addItem(item);
    item->setPos(view->rect().center());

    view->show();

    // Saving the graphical scene to another svg output device file using QSvgGenerator
    QSvgGenerator generator;
    generator.setFileName("output.svg");
    generator.setSize(QSize(static_cast<int>(scene->width()), static_cast<int>(scene->height())));
    generator.setViewBox(scene->sceneRect());
    generator.setTitle("SVG Generated using SVG Generator");
    generator.setDescription("an SVG drawing used by Software Package");
    QPainter painter;
    painter.begin(&generator);
    scene->clearSelection();
    scene->render(&painter);
    painter.end();

    return a.exec();
}

但我得到的是一个 svg 文件,其中包含初始 svg 文件的质量非常低的图像的转换损坏位。 我期望的是 QSvgGenerator 从源文件中获取初始 svg 元素(可能保存在场景中的 QGraphicsSvgItem 中)并将它们放入最后生成的文件中。


快速的答案是禁用每个上的缓存模式QGraphicsItem在将其渲染为 SVG* 之前。

QGraphicsSvgItem *item = new QGraphicsSvgItem(":The Pirate Bay Logo.svg");
item->setCacheMode(QGraphicsItem::NoCache);

原因是,当启用缓存模式时,图形项将其绘制缓存在位图图像(当然是光栅格式)中。因此,当被要求将其自身渲染到QSvgGenerator设备,它只是绘制缓存的位图。生成器将其正确编码为位图图像,而不是矢量。

这扩展到任何使用位图/QPixmap 来绘制或缓存自身的绘画。例如QSvgIconEngine(这会生成QIconSVG 文件中的 s)将使用位图进行绘制(即使原始源是矢量)。因此,将 QIcon 渲染到 QSvgGenerator 会生成光栅图像。

* 我会考虑启用缓存,并且仅在渲染回 SVG 之前禁用它,然后重新启用。您必须循环遍历所有场景项目,但在其余时间使用缓存获得的性能增益可能远远超过此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QSvgGenerator在生成Svg时将QSvgGraphicsItem转换为图像 的相关文章

随机推荐

  • 如果所有元素具有相同的 ID,则使它们可拖动

    使用 JQuery 当元素都具有相同的 ID 时 我尝试使多个元素可拖动 使用 JQuery 可以做到这一点吗 这里 有两个 id 为 draggable 的 div 我想让它们都可拖动 相关代码在这里 http jsfiddle net
  • 是否有像 [Table()] 这样的属性来创建映射到 EF Code First 中的视图的类?

    我正在使用实体框架代码优先 并尝试创建一个将映射到视图的类 我知道如何对表格进行操作 如下所示 Table FIL002 public class FIL002 Key DatabaseGeneratedAttribute Database
  • 从 PostgreSQL 中的文件插入 XML

    我有几个 XML 文件 想要将它们的内容插入到 PostgreSQL 表中 该表有两列 id 类型为serial 和一个xml类型列 我想在其中插入一个xml文件的内容 一行 一列 一个xml文件 在文档中我还没有找到如何从文件插入 xml
  • OpenClover - 开始使用 AspectJ

    我正在尝试将 Openclover 与使用 AspectJ 的项目一起使用 并将各个方面插入到其代码中 The pom xml与 AspectJ 相关的依赖关系如下
  • 使用 ssh 启用无密码身份验证[重复]

    这个问题在这里已经有答案了 如何使用 SSH 启用无密码身份验证 这是我在寻找 ssh 文件夹时得到的 bash 3 00 cd ssh bash 3 00 pwd home uname ssh bash 3 00 ls lt total
  • python中的稀疏分配列表

    我需要一个具有以下行为的列表 gt gt gt l SparseList gt gt gt l gt gt gt l 2 hello gt gt gt l None None hello gt gt gt l 5 None gt gt gt
  • javaFX 2.2 - 无法从控制器填充表

    我有下面的代码 当我尝试运行时 表不会在 GUI 上显示记录 你能建议一下吗 fxml tableview fxml 描述表结构的 fxml
  • Windows XP 下 Ruby FTP 速度极慢

    几周前 我编写了一个简单的 Ruby 脚本来在 Windows XP 环境中测试几个 FTP 命令 一切都按预期进行 我什至不知道代码运行所需的时间 我猜最多 3 4 秒 几天前 我正在开发的一个更复杂的 Ruby 应用程序开始运行非常缓慢
  • 对齐不同块的子元素

    我有一份商品清单 我需要在二维列表中显示它们 每个商品都有子元素 照片 标题 描述 价格和购买按钮 其大小和位置必须按以下方式设置 商品行中的所有标题 描述 价格和照片必须位于相同的 y 坐标位置 并且具有height 是一行中相应高度元素
  • 如何将 Core Animation 框架添加到我的 Xcode 项目中?

    我只是找不到添加它的框架 有任何想法吗 添加 QuartzCore 框架 它包含核心动画
  • Tomcat Java编译器区别

    我有两台 tomcat 5 5 服务器 一是用于开发 一是用于生产 两者都运行在 Java 1 6 上 但最近我遇到了一个问题 泛型无法在生产环境中运行 但在开发中运行顺利 这两个系统的区别在于tomcat 5 5 common lib 我
  • 支持断点/调试的Powershell Host

    如何在 Powershell 中创建支持断点 调试的 PSHost 我需要为此实现特殊功能吗 System Management Automation Runspaces Runspace包含属性Debugger http msdn mic
  • 一次向 Java 5 HashSet 添加多个字段?

    有没有更好的方法来做到这一点 这样我就不必在那里有 50 个 add 就像逗号分隔的列表或其他东西 比如 JavaScript 数组 private static final Set
  • 是否可以在 jQuery 中选择 $(this) 并使用选择器

    我想知道在运行函数之前是否可以使用 this 以及类选择器 所以 而不是做 this toggleClass open closed toggleClass open 做一些更像 this closed toggleClass open 实
  • 在圆周上放置传单标记的参数方程不精确?

    我正在开发一个应用程序 其中有圆心和半径 并且我在 Leaflet 的帮助下绘制圆 我在圆周的最北端放置了一个标记并使其可拖动 var circle L circle coords radius addTo map convertRadiu
  • 在多个选项卡中打开时 xPage 丢失会话

    我们有一个非常复杂的页面 其中有大量部分刷新 用于从多个来源获取数据并利用 DOJO 和 jQuery 一切都按其应有的方式进行 没有任何问题 但是 当在同一浏览器的不同选项卡上多次打开页面时 它似乎会以某种方式丢失会话 部分刷新不再起作用
  • Google PlayIntegrity API:一场噩梦

    我需要一些帮助 我是一个自学成才的加密新手 在阅读 测试和错误了两个多星期后如何解决这个问题 发现大众知识很少 几乎没有来自谷歌的文档 我正在尝试阅读诚信判决 我已经设法得到它IntegrityTokenRequest doing Stri
  • ngClass 指令:我可以使用多个表达式来添加多个类吗?

    这是我想要实现的目标的示例 data ng class tooltip show showTooltip tooltip brand settings name 但它不起作用 使用数组形式ng class div div 或者在 JavaS
  • 如何在java的xpath运行时禁用dtd?

    我的文件中有 dtd 但无法删除它 当我尝试用 Java 解析它时 我得到 Caused by java net SocketException Network is unreachable connect 因为它是远程 dtd 我可以以某
  • QSvgGenerator在生成Svg时将QSvgGraphicsItem转换为图像

    我有一堆 SVG 文件 我已将它们 作为 QGraphicsSvgItem 加载到 QGraphicsScene 中进行设计 一切都很好 现在我想使用 QSvgGenerator 将场景保存到另一个输出 SVG 文件 包括所有 Svg 项目