pyQt与交互式SVG图像
我想知道怎么把一个可以互动的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的大小。