将 QGraphicsScene 保存到 Svg 会更改缩放比例

2023-12-05

我需要保存我的项目QGraphicsScene到 svg,并能够将该 svg 加载回场景。
我能做到...
但每次将画布保存到 svg 时,加载时项目都会变大(并且重复保存和加载相同的 svg 会导致其增大)。
我找不到原因。

我附上了示例代码 - 以及结果。

测试1.pro

QT       += gui svg
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets core
TARGET = test1
TEMPLATE = app
SOURCES += \
    svggenerator.cpp

svggenerator.cpp

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QGraphicsSvgItem>
#include <QSvgGenerator>
#include <QSvgRenderer>
#include <QFile>
#include <QByteArray>
#include <QMessageBox>

void saveSceneToSvg(QGraphicsScene* s, const QString &filename) {
    QRectF newSceneRect;
    QGraphicsScene *tempScene = new QGraphicsScene(s->sceneRect());
    tempScene->setBackgroundBrush(QBrush(Qt::transparent));
    tempScene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
    foreach(QGraphicsItem* item, s->items()) {
        newSceneRect |= item->mapToScene(item->boundingRect()).boundingRect();
        tempScene->addItem(item);
    }
    tempScene->setSceneRect(newSceneRect);
    tempScene->clearSelection();
    QSize sceneSize = newSceneRect.size().toSize();

    QSvgGenerator generator;
    generator.setFileName(filename);
    generator.setSize(sceneSize);
    generator.setViewBox(QRect(0, 0, sceneSize.width(), sceneSize.height()));
    generator.setDescription(QObject::tr("My canvas exported to Svg"));
    generator.setTitle(filename);
    QPainter painter;
    painter.begin(&generator);
    tempScene->render(&painter);
    painter.end();

    tempScene->clear();
    delete tempScene;
}

void loadSvg(QGraphicsScene* s, const QString &filename, const QPointF& p) {
    QGraphicsSvgItem* item = new QGraphicsSvgItem();
    QFile file(filename);
    file.open(QFile::ReadOnly);
    QByteArray contents = file.readAll();
    item->setSharedRenderer(new QSvgRenderer(contents));
    file.close();
    item->setPos(p);
    s->addItem(item);
}

void processScene(QGraphicsScene* s) {
    QGraphicsEllipseItem* eli = new QGraphicsEllipseItem();
    eli->setRect(QRectF(0, 0, 100, 100));
    eli->setPen(Qt::NoPen);
    eli->setBrush(Qt::red);
    eli->setPos(100, 300);
    s->addItem(eli);

    QGraphicsEllipseItem* eli1 = new QGraphicsEllipseItem();
    eli1->setRect(QRectF(0, 0, 100, 100));
    eli1->setPen(Qt::NoPen);
    eli1->setBrush(Qt::yellow);
    eli1->setPos(150, 300);
    s->addItem(eli1);

    QMessageBox::information(NULL, "hi", "click");

    saveSceneToSvg(s, "abcd.svg");
    loadSvg(s, "abcd.svg", QPointF(100,300));

    QMessageBox::information(NULL, "hi", "click");

    saveSceneToSvg(s, "abcd1.svg"); // saved with a dif name so I can see
    loadSvg(s, "abcd1.svg", QPointF(100,300));

    QMessageBox::information(NULL, "hi", "click");

    saveSceneToSvg(s, "abcd2.svg");
    loadSvg(s, "abcd2.svg", QPointF(100,300));

    // .... each time i call them they grow larger
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QGraphicsScene s;
    s.setSceneRect(50, 0, 1000, 800);
    QGraphicsView view(&s);
    view.show();
    processScene(&s);
    return app.exec();
}

Result:

enter image description here

看看 svgs 本身,我可以看到 svgs 的大小增加了大约 1.25...我无法解释,也不能确定这对于其他示例来说也是如此。 (似乎是)

是什么导致了这种增长?我怎样才能阻止它?

(我还注意到顺序是不同的......我刚刚注意到这是一个不同的问题......但因为在我的“真实”代码中我也有 z 顺序,我不在乎。)

保存我认为很好 - 生成的 svg 具有预期大小的大小和视图框。

加载其他 svg 没问题 - 从外部源保存 svg 会创建大小相似的 svg。

问题似乎是当我加载 svg 生成器创建的 svg 时,它的大小会增加。

(如果我能确定情况总是如此,我可以尝试在加载时缩小它,但每次比率并不完全是 1.25,虽然很接近......而且我不知道如何区分外部 svg 之间的差异和一个生成的)。


它看起来像是 SvgGenerator 的一个错误。您提供给 SVG 生成器的大小仅用于形成 svg 的标题。 .svg 文件的实际大小与标头中写入的大小不同。我发现的唯一解决方法是在保存时简单地减少 25% 的大小,类似于:

int width = qCeil(qreal(sceneSize.width()/1.25));
int height = qCeil(qreal(sceneSize.height()/1.25));

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

将 QGraphicsScene 保存到 Svg 会更改缩放比例 的相关文章

  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何使QTableView类的restoreState()和saveState()正常工作?

    首先 我想说 我的问题已经在这里讨论过 并且这里是 https stackoverflow com questions 1163030 qt qtableview and horizontalheader restorestate 但答案并
  • SVG 文本无法在 Chrome 或 Safari 中呈现

    我有一些 SVG 文本在 Firefox 上运行良好 但在 Chrome 和 Safari 中却没有出现 我努力了 向 svg 容器添加填充 以防文本被隔断 从文本中删除 xml space preserve 添加内联填充颜色
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 无法在带有 QSortFilterProxyModel 的 QTreeView 的点击信号中使用 itemFromIndex

    我有一个 QTreeView 在视图和 QStandardItemModel 之间有一个 QSortFilterProxyModel 来对树进行排序 然后我想通过 clicked 信号对视图中的点击进行操作 模型 视图的设置类似于 mymo
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table

随机推荐

  • 如何获取类中所有方法的方法引用(Java)?

    方法参考对于 Java 8 中的特定方法可以获取为Class Method 但是如何获取一个类的所有方法的方法引用呢 所有想要的方法都有不同的方法名称 但是same类型签名 此外 方法的名称是未知之前 Example class Test
  • django-tables2 linkColumn 外部 url

    我有 2 个模型属性 model name 和 model url 我需要创建一个 linkColumn 该列名称 model name 并链接到中指定的 url 型号 url 有可能实现这样的目标吗 thanks 您可以使用 Templa
  • 如何在本地主机上运行html文件?

    我有一个 HTML 文件 并在本地主机上运行它 但是 该文件包含使用网络摄像头的镜像 例如 我怎样才能运行这个 HTML 文件在本地主机上 在此示例中 当选中实时复选框时 网络摄像头将启动 您可以在以下位置运行您的文件http服务器 1 g
  • EF Core SaveChanges 是否根据数据注释进行验证

    我有一个带有数据注释的模型 我想知道如果数据注释失败 SaveChanges 方法是否可能失败 我期望 SaveChanges 抛出 Test2 超出 2 到 4 范围 的异常 相反 它保存到数据库中 例如 这是我的测试实体 public
  • 需要 iPv6 兼容性 - iOS 应用被苹果拒绝

    6 月 1 日之后 我向 itunes connect 提交了我的 ionic 应用程序 并收到了来自苹果的消息 应用程序在 IPv6 网络上进行审核 请确保您的应用支持 IPv6 网络 as IPv6兼容性 是必须的 有关支持 IPv6
  • Powershell调用Github API:ConvertFrom-Json管道之谜

    我正在使用 PowerShell 调用 GitHub API 结果是一个 JSON 数组 我使用 ConvertFrom Json cmdlet 将其转换为 PowerShell 对象 这给了我一个 PowerShell 对象数组 但是 当
  • 如何按类查找元素

    我在使用 Beautifulsoup 解析具有 class 属性的 HTML 元素时遇到问题 代码看起来像这样 soup BeautifulSoup sdata mydivs soup findAll div for div in mydi
  • 如何实时查看设备上的应用变化?

    每次我更改代码时 即使只有一行 我也必须运行命令 sudo ionic cordova prepare ios 我必须单击 Xcode 上的播放按钮才能将应用程序上传到 iPhone 上并查看操作中的更改 基本上每次我想测试应用程序时 我都
  • 在 Google AppEngine 上实施 REST 服务 (JSON) [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在尝试在 Google AppEngine 上实现 REST 服务 我更喜欢使用 GAE Java 和 JSON 在服务和客户端之间进行通信 每个人最喜欢执行此操作的库是什么 您更喜欢
  • Excel vba - 比较两个范围并查找不匹配项

    我有两张 Excel 工作表 其中一张包含用户列表 而另一个列表包含相同的数据 只是同一用户被列出了多次 现在 我需要某种方法将第二个列表与第一个列表进行比较 并删除包含第一个列表中未找到的用户的行 第一个列表如下所示 保罗 麦卡特尼 约翰
  • 如何使用 JavaScript 以跨浏览器的方式将 DOM 序列化为 XML 文本?

    我有一个 XML 对象 使用加载XMLHTTPRequest s responseXML 我已经修改了该对象 使用 jQuery 并希望将其作为文本存储在字符串中 Firefox 等显然有一种简单的方法可以做到这一点 var xmlStri
  • 当结果集在逻辑应用中只有一条记录时,Foreach 不支持

    我必须从 XML 读取数据并将其加载到 SQL 因此 在中间 我需要为逻辑应用中的每个任务使用的每个记录添加一些业务逻辑 但是 当 XML 中只有一条记录时 结果将被视为对象而不是数组 并且逻辑应用程序失败 这是我的 XML 的样子
  • 计算iPhone所有尺寸的长宽比

    我知道这种类型的问题已经被问过好几次了 但我对 iphone 比较陌生 所以对所有答案感到困惑 因为我的徽标是 61 57 我想根据 iphone 的大小进行更改 但是当我指定所有屏幕的长宽比时 它会给出自己的比例 但我很困惑这个比率是如何
  • Html.RenderAction 使用 Post 而不是 Get

    我的页面上有一个简单的表格 提交后 它会检查是否ModelState IsValid如果无效 则返回具有相同模型的视图 在同一页面上 我正在呈现一个包含另一个表单的操作 如下所示 Html RenderAction AccountNote
  • 使用 sizeWithFont:constrainedToSize:lineBreakMode 计算 UITextView 文本的高度似乎没有返回正确的结果

    我正在尝试计算受 UITextView 约束的文本的高度 但它似乎没有返回正确的结果 这是我的代码 void textViewDidChange UITextView aTextView CGSize textSize aTextView
  • 如何在 Outlook Web App (OWA)、Outlook 2016 Mac 和 Windows 中的 Outlook 加载项中显示垂直窗格

    我正在开发一个针对 OWA Outlook 2016 for Mac Windows 的 Outlook 插件 我的要求是显示加载项垂直位于右侧在阅读和撰写邮件时 对于撰写 它默认显示为所需的 但对于阅读 它是水平显示的 我想垂直显示 简而
  • 主干,而不是“this.el”包装

    我广泛使用模板 我喜欢用完全包含模板 我的意思是我想看到template对所有 DOM 元素进行编码 包括root一 像这样 但 Backbone 喜欢的是template像这样
  • 如何以编程方式清除或更新 Azure AD B2C MFA 的电话号码?

    我们正在使用此处找到的示例在 Azure AD B2C 上测试 MFA https github com azure ad b2c samples tree master policies mfa unknown devices 我们知道这
  • 如何通过javascript获取查询字符串?

    如何从 JavaScript 中的 URL 中提取查询字符串 谢谢你 您可以轻松构建字典风格的集合 function getQueryStrings var assoc var decode function s return decode
  • 将 QGraphicsScene 保存到 Svg 会更改缩放比例

    我需要保存我的项目QGraphicsScene到 svg 并能够将该 svg 加载回场景 我能做到 但每次将画布保存到 svg 时 加载时项目都会变大 并且重复保存和加载相同的 svg 会导致其增大 我找不到原因 我附上了示例代码 以及结果