使用Qt在不影响线宽和半径的情况下缩放SVG

时间:2012-02-16 09:50:57

标签: qt svg rendering

我想将SVG用作可缩放的背景图像(例如,圆角矩形作为按钮的背景)。我的问题是,按钮大小取决于按钮内容 - 例如它的文字。现在我需要一种方法来绘制不同大小和方面的SVG,但具有相同的线宽和半径。

在我的方法中,我使用了一个宽度和高度为100%的SVG

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg">
<rect id="rect0815" x="0" y="0" width="100%" height="100%" rx="15" ry="15" 
      fill="red" stroke="#000000" stroke-width="2"/>
</svg>

并将其渲染为背景:

void paintEvent(QPaintEvent * pEvent)
{
    QPainter oPainter( this );
    QSvgRenderer oRenderer( QString("../share/images/background.svg") );
    oRenderer.render( &oPainter, pEvent->rect() );
}

但这给了我与使用固定宽度SVG相同的失真结果。我也尝试QSvgRenderer::setViewPort()没有任何积极的影响。

致以最诚挚的问候,

查理

1 个答案:

答案 0 :(得分:2)

行宽请求非常简单:将vector-effect="non-scaling-stroke"添加到SVG:

<rect id="rect0815" vector-effect="non-scaling-stroke" x="0" ... />

我知道在首次绘制/调整按钮并动态更新SVG时,无法防止半径缩放重新计算。但是,这几乎打败了SVG的观点;你不妨进行计算并直接绘制它。