如何在Qt5中以我选择的颜色仅绘制SVG图标的轮廓?

如何在Qt5中以我选择的颜色仅绘制SVG图标的轮廓?,svg,colors,icons,qt5,paint,Svg,Colors,Icons,Qt5,Paint,在Qt5中(我在Ubuntu 16.04 amd64上使用5.8),绘制SVG很容易。然而,我想使用SVG来表示图标,在这种情况下,如果我可以将它们以单一颜色绘制为轮廓(有点像字体图标,比如font awesome),那将非常有用 这是否可以在不编写太多自定义代码的情况下实现?例如,使用QtCreator UI designer可以轻松完成吗?我找到了一种解决方法。它可能不是最好的(这就是为什么我首先问这个问题),但在更好的东西出现之前,我会使用它。以下是我的结果: 请注意,灰色区域是窗口,完

在Qt5中(我在Ubuntu 16.04 amd64上使用5.8),绘制SVG很容易。然而,我想使用SVG来表示图标,在这种情况下,如果我可以将它们以单一颜色绘制为轮廓(有点像字体图标,比如font awesome),那将非常有用


这是否可以在不编写太多自定义代码的情况下实现?例如,使用QtCreator UI designer可以轻松完成吗?

我找到了一种解决方法。它可能不是最好的(这就是为什么我首先问这个问题),但在更好的东西出现之前,我会使用它。以下是我的结果:

请注意,灰色区域是窗口,完全不被触摸

首先,您需要一个屏幕外的
QPixmap
来进行渲染。在我的实现中,我已经有了一个用于执行双缓冲的实现。由于不建议在每次重画时都重新呈现复杂的SVG,因此您也应该有一个SVG

在我的代码中的“双缓冲区大小已更改,需要重新渲染”部分中,我只需使用以下命令将双缓冲区清除为透明:

mDoubleBuffer.fill(QColor("#00000000"));
然后,我使用以下命令将svg渲染为正常:

QPainter painter(mDoubleBuffer);
mSVG->render(&painter);
最后,我提出以下几点:

if(mSilhouetteEnabled) {
    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    painter.fillRect(QRect(0,0,w,h), mSilhouetteForeground);
}
通过将painter的合成模式切换到
QPainter::CompositionMode_SourceIn
,并绘制一个覆盖双缓冲区整个区域的纯色矩形,它实际上将仅替换颜色,而不使用alpha通道


然后,当我们在屏幕上绘制这个精心准备的双缓冲区时,它将是SVG的纯色轮廓,具有完整的alpha通道。

根据SVG的精确性质,您可以使用其中一个,或生成位图,然后以所需颜色渲染,以便在
QIcon
@G.M中使用。谢谢!但我需要一个完整的alpha通道,而不仅仅是一个位掩码。我想我通过合成成功了,见下面我的答案。但是我希望代码少一点。这样做,我必须重新实现所有使用SVG图标的小部件:(