0

有没有办法在 svg 文件中实现类似于脚本的东西,所以它在 python gui 中打开时可以工作?我需要类似于此示例中的功能,但我在 python 中打开我的 svg,如下所示:

self.setScene(QtGui.QGraphicsScene(self))
self.scene().addItem(QtSvg.QGraphicsSvgItem(QtCore.QFile(pathToMySVG).fileName()))

self在哪里QtGui.QGraphicsView

我也尝试过不编写脚本,使用这些示例,但仍然没有交互性。

任何帮助示例将不胜感激。

4

2 回答 2

1

@Vicent 实际上我找到了使用 QGraphicsWebView() 的解决方案:

import sys
from PyQt4 import QtCore, QtGui, QtSvg
from PyQt4.QtWebKit import QGraphicsWebView
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    scene = QtGui.QGraphicsScene()
    view = QtGui.QGraphicsView(scene)

    br = QtSvg.QGraphicsSvgItem("C:\my_interactive_svg.svg").boundingRect()

    webview = QGraphicsWebView()
    webview.load(QtCore.QUrl("C:\my_interactive_svg.svg"))
    webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape)
    webview.setCacheMode(QtGui.QGraphicsItem.NoCache)
    webview.resize(br.width(), br.height())

    scene.addItem(webview)
    view.resize(br.width()+10, br.height()+10)
    view.show()
    sys.exit(app.exec_())

它非常适合我(脚本和其他东西)。

唯一我不喜欢的是我必须将我的 svg 加载为 QGraphicsSvgItem,因为我不知道其他方法来获取我的 svg 的大小。显然webview.size()不返回预期值。

于 2012-10-30T15:31:50.587 回答
1

根据QtSvg 模块文档

Qt 支持 SVG 1.2 Tiny 的静态特性。目前不支持 ECMA 脚本和 DOM 操作。

因此,如果您要使用该QtSvg模块,则仅限于此处描述的静态功能。

更新

@Aleksandar 阅读您的答案后,我进一步调查以删除对QtSvG模块的依赖关系。下面的代码实现了这个目标(诀窍是在调整容器大小之前加载图像):

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtWebKit import QGraphicsWebView
class Scene(QtGui.QGraphicsScene):
    def __init__(self):
        super(QtGui.QGraphicsScene, self).__init__()
        self.view = QtGui.QGraphicsView(self)

        self.webview = QGraphicsWebView()
        self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape)
        self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache)
        self.addItem(self.webview)

        self.webview.loadFinished.connect(self.svgLoaded)

    def svgLoaded(self):
        frame = self.webview.page().mainFrame()
        fsize = frame.contentsSize()
        self.webview.resize(QtCore.QSizeF(fsize))
        self.view.resize(fsize.width() + 10, fsize.height() + 10)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    v = Scene()
    svg = QtCore.QUrl("Bitmap_VS_SVG.svg")
    v.webview.load(svg)
    v.view.show()
    sys.exit(app.exec_())

代码可能需要更多的爱,但我现在没有时间。无论如何,我希望它对你有用。

于 2012-10-29T20:17:31.010 回答