Qt-更改QSvgWidget的颜色

时间:2019-07-14 08:58:45

标签: python qt svg pyqt

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

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

渲染的SVG的颜色为黑色。我该如何更改?

1 个答案:

答案 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')