pyQt与交互式SVG图像

3 投票
2 回答
7929 浏览
提问于 2025-04-17 05:40

我想知道怎么把一个可以互动的SVG文件加到QGraphicsScene里。我可以把SVG文件加进去,但它只是作为一张静态图片显示。我看到有人提到QGraphicsWebView,但我不知道怎么把SVG文件放进去,而且相关的例子也不多。

让我更具体一点说我想要的效果。假设我有一个绘制方框的SVG文件。当我把鼠标移到那个方框上时,我希望颜色能改变,这个变化是由鼠标悬停事件触发的。我需要修改文件然后重新绘制图片吗?我觉得应该有办法让SVG文件在Qt中实现互动效果。

2 个回答

2

我找到了一种方法,但我觉得这不是最好的办法。我有两个文件:
white.svg 和 green.svg

在鼠标悬停的功能里,我会显示这些图片并强制让它们显示出来。

def hoverEnterEvent(self, event):
    self.render.load('green.svg')
    self.show()

def hoverLeaveEvent(self, event):
    self.render.load('white.svg')
    self.show()

这里的 self 是一个 QGraphicsSvgItem 对象。

我不喜欢这种方法,因为我现在需要两个 .svg 文件,而不是一个。如果有人有更好的解决办法,我很乐意听听。

5

我也遇到过同样的问题,你的问题让我找到了正确的方向(使用 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:\your_interactive_svg.svg").boundingRect()

    webview = QGraphicsWebView()
    webview.load(QtCore.QUrl("C:\your_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的大小。

撰写回答