我尝试使用QSvgWidget渲染嵌入式svg文件。我的文件“front.svg”看起来像这样:
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="500" height="500" id="svgfile">
<rect style="fill:#ff0000;" id="rect1" width="150" height="200"/>
<svg x="100" y="100">
<rect style="fill:#00ff00;" id="rect2" width="200" height="120"/>
</svg>
</svg>
这个文件在Chrome或Inkscape中看起来很正常,但在svgwidget中看起来很奇怪。只有绿色矩形可见,红色非常小,隐藏在绿色矩形后面。 这是我的python代码:
import sys
from PySide.QtGui import QApplication
from PySide.QtSvg import QSvgWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = QSvgWidget('front.svg')
widget.show()
sys.exit(app.exec_())
有人知道,我做错了什么,还是PySide中的一些错误?
答案 0 :(得分:2)
您可以删除额外的内部<svg>
标记,并将x和y属性移动到<rect>
元素,以使其正确呈现:
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="500" height="500" id="svgfile">
<rect style="fill:#ff0000;" id="rect1" width="150" height="200"/>
<rect style="fill:#00ff00;" id="rect2" x="100" y="100" width="200" height="120"/>
</svg>
我认为这是一个人为的例子来测试这个具体案例,但是?您是否需要嵌套<svg>
元素?
答案 1 :(得分:2)
对我来说, Inkscape 按照您的意图呈现了您的SVG文件,但是由PyQt4中的额外嵌入对象创建的组对象存在问题,我在那里观察到与您相同的情况。所以我很确定这是你的SVG结构的问题,而不是PySide。 我希望这会有所帮助。
答案 2 :(得分:2)
我找到了解决此问题的方法。现在我使用的是QGraphicsWebView而不是QSvgWidget。这是我的Python代码(svg文件保持不变):
import sys
from PySide.QtGui import QApplication, QGraphicsScene, QGraphicsView
from PySide.QtWebKit import QGraphicsWebView
if __name__ == '__main__':
app = QApplication(sys.argv)
item = QGraphicsWebView()
item.load('front.svg')
view = QGraphicsView()
scene = QGraphicsScene()
scene.addItem(item)
view.setScene(scene)
view.show()
sys.exit(app.exec_())
奇怪的是,QT使用这个小部件正确呈现svg文件,使用专用小部件完全错误(我也遇到了“text”元素的问题)。 但现在一切正常。