3

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

4

3 回答 3

3

我找到了一些解决这个问题的方法。现在我使用 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 文件,而使用专用小部件完全错误(我也遇到了“文本”元素的问题)。但现在一切正常。

于 2012-07-03T12:40:49.223 回答
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>元素的理由吗?

于 2012-06-28T22:39:55.520 回答
2

对我来说,Inkscape按照您的意图渲染了您的 SVG 文件,但是由 PyQt4 中的额外嵌入对象创建的组对象存在问题,我观察到与您相同的情况。所以我相当肯定这是你的 SVG 结构的问题,而不是 PySide。我希望这有帮助。

于 2012-07-02T14:29:54.910 回答