我有一个添加到Qt布局中的SVG图像
mySvg = QtSvg.QSvgWidget('/path/to/hello.svg')
layout.addWidget(mySvg)
渲染的SVG的颜色为黑色。我该如何更改?
答案 0 :(得分:1)
可能有一个更优雅的解决方案,但我通过使用python标准模块xml/svg
直接编辑xml.etree.ElementTree
内容来实现了这一点。
我不知道svg
规范,但是在我的情况下,我要更改颜色的 path 具有标签path
。可能必须为其他文件更改标签。
使用第二种方法,您可以将svg
作为QByteArray
获得,您可以直接将其移交给QSvgWidget
。
就我而言,对svg
内容进行一些其他修改是必要的-使用这种方法,您可以非常灵活地进行操作。
子类化QSvgWidget
以便集成此功能也许更有意义。
import xml.etree.ElementTree as Et
from PyQt5.QtCore import Qt, QByteArray
from PyQt5.QtGui import QColor
class Icon:
def __init__(self, icon_path, color=Qt.white):
self.tree = Et.parse(icon_path)
self.root = self.tree.getroot()
self._change_path_color(color)
def _change_path_color(self, color):
c = QColor(color)
paths = self.root.findall('.//{*}path')
for path in paths:
path.set('fill', c.name())
def get_QByteArray(self):
xmlstr = Et.tostring(self.root, encoding='utf8', method='xml')
return QByteArray(xmlstr)
编辑:xpath(.//{*}path
)中的*通配符是python 3.8中的新功能。对于上一个。必须在xpath中指定名称空间的版本:
self.namespace = root.tag.split('}')[0].strip('{')
...
paths = self.root.findall(f'.//{{{self.namespace}}}path')