首页 > 解决方案 > 如何使 QSvgGenerator 生成矢量化 SVG 而不是位图 SVG?

问题描述

我正在尝试将我的导出QGraphicsScene到这样的 SVG:

void MyScene::toSvg(QString filename)
{
    QSvgGenerator svgGen {};

    svgGen.setFileName(filename);
    svgGen.setSize({ 200, 200 });
    svgGen.setViewBox(QRect(0, 0, 200, 200));

    QPainter painter {};
    painter.begin(&svgGen);
    render(&painter);
    painter.end();
}

MyScene继承自QGraphicsScene

在我的场景中,我有继承自QGraphicsItem.

我的项目呈现如下:

void Node::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
    Q_UNUSED(widget)
    Q_UNUSED(option)

    painter->save();

    QPainterPath path;
    const QRectF rect(-m_size.width() / 2, -m_size.height() / 2, m_size.width(), m_size.height());
    path.addRoundedRect(rect, m_cornerRadius, m_cornerRadius);
    painter->setRenderHint(QPainter::Antialiasing);
    painter->fillPath(path, QBrush(m_color));

    painter->restore();
}

现在的问题是我只得到一个位图 SVG,所以它基本上没用。像这样的东西:

<image x="38" y="59" width="41" height="15" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAPCAYAAAB5lebdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABGUlEQVRIie2TwWqEMBCG/2TXgCwe40lY8OhL6Ev4PEuex5fQl/AoCHsyeFIQdZ301FLFtVRLaWG/45BkvsnMAC9e/C3YN+N7MUcuL2VYFEWnqqr49XplAFCWpXFdl44kAYAwDEkpZbBDeCYZx/FJa22N42gRkQUAnPPxcrkckmyahjzPm7TW9El2jdX4TDKKonPf9xYRWZzzMwAQ0cO2bRJC7G5ZXdfGcRyybdtsdebZb2+2u+s6JqWkoigOzRQA+L7PtNa873vmOA5fFiGEMJ7nTUEQPJRSsyLOi7dMmqYTgCnP86NeH9xuN5ZlGZdS4n6/n9bODMPA2rZdXdif3uIt2LvsswNSSpMkCeGLdv8Wz/IeHqsX/543cmeARGeRY78AAAAASUVORK5CYII=" />

为了真正获得 SVG 而不是位图,我应该在我的项目中做一些特别的事情吗?

编辑:这似乎是相关的,但在我的情况下禁用缓存对普通 QGraphicsItems 没有帮助:QSvgGenerator 在生成 Svg 时将 QSvgGraphicsItem 转换为图像

标签: qtsvgqt5qgraphicssceneqtsvg

解决方案


似乎QGraphicsDropShadowEffect为项目设置强制它们为位图(连同效果图形)。如果我不设置此效果,SVG 将被矢量化。


推荐阅读