В приложении Python3 / QT5 я пытаюсь показать изображение SVG, построенное изначально в виде строки.Мне нужно манипулировать этим SVG-изображением (например, изменить его цвет), поэтому у меня есть строка, изменяющаяся со временем.Вот минимальный рабочий пример:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtSvg import QSvgWidget
svg_str = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="300" height="300" viewBox="0 0 300 300" id="smile" version="1.1">
<path
style="fill:#ffaaaa"
d="M 150,0 A 150,150 0 0 0 0,150 150,150 0 0 0 150,300 150,150 0 0 0
300,150 150,150 0 0 0 150,0 Z M 72,65 A 21,29.5 0 0 1 93,94.33
21,29.5 0 0 1 72,124 21,29.5 0 0 1 51,94.33 21,29.5 0 0 1 72,65 Z
m 156,0 a 21,29.5 0 0 1 21,29.5 21,29.5 0 0 1 -21,29.5 21,29.5 0 0 1
-21,-29.5 21,29.5 0 0 1 21,-29.5 z m -158.75,89.5 161.5,0 c 0,44.67
-36.125,80.75 -80.75,80.75 -44.67,0 -80.75,-36.125 -80.75,-80.75 z"
/>
</svg>
"""
# ==========================================
with open('smile.svg', 'w') as f:
f.write(svg_str)
# ==========================================
app = QApplication(sys.argv)
svgWidget = QSvgWidget('smile.svg')
svgWidget.setGeometry(100,100,300,300)
svgWidget.show()
sys.exit(app.exec_())
Моя проблема в том, что я не мог найти способ обойти необходимость сохранения файла для создания экземпляра объекта QSvgWidget
из самой строки.Я не хочу сохранять файлы без разбора, и я не могу найти способ загрузить xml
информацию непосредственно в QSvgWidget
объект ...
Я нашел решение, наиболее близкое к моим желаниям, и оновыглядит так:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtSvg import QSvgWidget, QSvgRenderer
from PyQt5.QtCore import QXmlStreamReader
from PyQt5.QtGui import QPainter
svg_str = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="300" height="300" viewBox="0 0 300 300" id="smile" version="1.1">
<path
style="fill:#ffaaaa"
d="M 150,0 A 150,150 0 0 0 0,150 150,150 0 0 0 150,300 150,150 0 0 0
300,150 150,150 0 0 0 150,0 Z M 72,65 A 21,29.5 0 0 1 93,94.33
21,29.5 0 0 1 72,124 21,29.5 0 0 1 51,94.33 21,29.5 0 0 1 72,65 Z
m 156,0 a 21,29.5 0 0 1 21,29.5 21,29.5 0 0 1 -21,29.5 21,29.5 0 0 1
-21,-29.5 21,29.5 0 0 1 21,-29.5 z m -158.75,89.5 161.5,0 c 0,44.67
-36.125,80.75 -80.75,80.75 -44.67,0 -80.75,-36.125 -80.75,-80.75 z"
/>
</svg>
"""
# ==========================================
class QSvgWidget_from_string(QSvgWidget):
def __init__(self, strSVG):
super().__init__()
self.strSVG = strSVG
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
svg_render = QSvgRenderer(QXmlStreamReader(self.strSVG))
qp.restore()
svg_render.render(qp)
qp.end()
# ==========================================
app = QApplication(sys.argv)
svgWidget = QSvgWidget_from_string(svg_str)
svgWidget.setGeometry(100,100,300,300)
svgWidget.show()
sys.exit(app.exec_())
Но я не удовлетворен, потому что мне нужно расширить класс QSvgWidget
только для того, чтобы создать его экземпляр из строки xml
.Мой вопрос: Есть ли способ сделать это без необходимости прибегать к QPaint
и paintEvent
?