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