0

svgファイルのスクリプトに似たものを実現する方法はありますか?PythonGUIで開いたときに機能しますか?こののような機能が必要ですが、Pythonでsvgを次のように開いています:

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

はどこselfですかQtGui.QGraphicsView

これらの例を使用して、スクリプトを使用せずに試しましたが、それでも対話性はありません。

ヘルプの例をいただければ幸いです。

4

2 に答える 2

1

QtSvgモジュールのドキュメントによると:

QtはSVG1.2Tinyの静的機能をサポートしています。ECMAスクリプトとDOM操作は現在サポートされていません。

したがって、モジュールを使用する場合は、ここでQtSvg説明する静的機能に制限されます。

更新

QtSvG@Aleksandarあなたの答えを読んだ後、モジュールへの依存関係を取り除くために私はさらに調査しました。次のコードは、まさにその目標を達成します(トリックは、コンテナーのサイズを変更する前にイメージをロードすることです)。

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 に答える
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のサイズを取得する他の方法がわからなかったため、svgをQGraphicsSvgItemとしてロードする必要があることだけです。どうやらwebview.size()期待値を返しません。

于 2012-10-30T15:31:50.587 に答える