pyQt с интерактивными изображениями SVG

Как мне добавить интерактивный файл SVG в QGraphicsScene? Я могу добавить интерактивный файл SVG, но он просто отображается в виде статического изображения. Я читал о QGraphicsWebView, но не могу понять, как добавить в него файлы SVG, а примеров нет.

Позвольте мне быть более конкретным с тем, что я ищу. Допустим, у меня есть файл SVG, который рисует прямоугольник. Когда я наводю курсор мыши на это поле, я хочу изменить цвет, вызванный событием наведения мыши. Нужно ли редактировать файл и перерисовывать изображение? Похоже, должен быть способ создания интерактивных файлов SVG с помощью Qt.

2 ответа

Решение

У меня была та же проблема, и ваш вопрос указал мне правильное направление (используя 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.

Я нашел способ, но я не думаю, что это лучший способ. У меня есть два файла: 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, вставленных в один. Если у кого-то есть лучшее решение, я открыт для предложений.

Другие вопросы по тегам