PySide - QSvgWidget错误地呈现嵌入的SVG文件

时间:2012-06-17 10:05:29

标签: python svg pyside qwidget

我尝试使用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中的一些错误?

3 个答案:

答案 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”元素的问题)。 但现在一切正常。