Python Qt-更改QSvgWidget的颜色

Python Qt-更改QSvgWidget的颜色,python,qt,svg,pyqt,Python,Qt,Svg,Pyqt,我有一个SVG图像,可以添加到我的Qt布局中 mySvg=QtSvg.QSvgWidget('/path/to/hello.svg')) layout.addWidget(mySvg) 渲染SVG的颜色为黑色。如何更改此设置?可能有一个更优雅的解决方案,但我通过python标准模块xml.etree.ElementTree直接编辑xml/svg内容来实现此功能。 我不知道svg规范,但在我的例子中,我想要更改颜色的路径有标签path。可能必须更改其他文件的标记。 使用第二种方法,您可以将svg

我有一个SVG图像,可以添加到我的Qt布局中

mySvg=QtSvg.QSvgWidget('/path/to/hello.svg'))
layout.addWidget(mySvg)

渲染SVG的颜色为黑色。如何更改此设置?

可能有一个更优雅的解决方案,但我通过python标准模块
xml.etree.ElementTree
直接编辑
xml/svg
内容来实现此功能。 我不知道
svg
规范,但在我的例子中,我想要更改颜色的路径有标签
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')