Python 3.x 如何从string/xml流在PyQT5中显示SVG图像?
在Python3/QT5应用程序中,我试图显示最初构建为字符串的SVG图像。我需要操纵这个SVG图像(例如,改变它的颜色),这样字符串就会随着时间的推移而改变。下面是一个简单的工作示例:Python 3.x 如何从string/xml流在PyQT5中显示SVG图像?,python-3.x,svg,qt5,pyqt5,Python 3.x,Svg,Qt5,Pyqt5,在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"
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
字符串实例化它。我的问题是:是否有任何方法不必求助于QPaint
和paintEvent
?您可以获得QSvgWidget
使用的qsvgRender
来渲染SVG。它允许从文件、字节数组或流加载数据:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtSvg import QSvgWidget, QSvgRenderer
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>
"""
svg_bytes = bytearray(svg_str, encoding='utf-8')
app = QApplication(sys.argv)
svgWidget = QSvgWidget()
svgWidget.renderer().load(svg_bytes)
svgWidget.setGeometry(100,100,300,300)
svgWidget.show()
sys.exit(app.exec_())
导入系统
从PyQt5.QtWidgets导入QApplication
从PyQt5.QtSvg导入QSvgWidget、qsvgrender
svg_str=”“”
"""
svg_bytes=bytearray(svg_str,编码='utf-8')
app=QApplication(sys.argv)
svgWidget=QSvgWidget()
svgWidget.renderer().load(svg_字节)
svgWidget.setGeometry(100100300300)
svgWidget.show()
sys.exit(app.exec_())
此处的更多信息:如果您不需要
QSvgWidget
例如,您希望获得QImage
(您可以从中获得QPixmap
和QIcon
),您可以使用:
qimage = QtGui.QImage.fromData(svg_bytes)
确保svg
位于
qimage = QtGui.QImage.fromData(svg_bytes)