Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Probleme mit Darstellung großer SVG-Dateien



  • Mein Name ist Hendrik und ich entwickle seit ca. 1,5 Jahren Anwendungssoftware mit folgender Konfiguration:

    • Debian Linux x64 v9.13
    • Python v3.5.3
    • Qt 5.15.0 unter PySide2
    • als Entwicklungs-GUI setzte ich Eclipse ein

    Seit einigen Wochen beschäftige ich mit OpenStreetMap (OSM). Ich habe den Datenbestand der OSM-Daten aus Deutschland in einer lokalen PostGreSQL-Datenbank und habe mir mit Hilfe der Bibliotheken »mapnik« und »cairo« einen Renderer geschrieben, der mir aus einen Rechteck von GPS-Koordinaten eine SVG-Vektorgraphik rendert. Die gerenderten Graphiken sehen gut aus, wenn ich sie z.B. mit InkScape öffne.

    svgdorf_inkscape.png

    Jetzt kommt das Problem. Wenn ich die SVG-Graphic in Qt öffne, bekomme ich zunächst in der Konsole 298 Warnungen der Form

    qt.svg: <SVG-FILE>:71772: Could not resolve property: #pattern0
    ...
    qt.svg: <SVG-FILE>:71772: Could not resolve property: #pattern297
    

    und anschließend ca. 8.500 Zeilen der Form

    qt.svg: link #glyph0-1 is undefined!
    ...
    qt.svg: link #glyph241-0 is undefined!
    

    Die Links sind allesamt vorhanden, ich habe ca. 70 - 80 Links überprüft. Das Ergebnis in meiner Application sieht dann leider so aus:

    svgdorf_qt.png

    Alle Bezeichnungen fehlen, lediglich die Bezeichnungen mit Outline-Schriften sind zu erkennen.

    Ich benutzte ein vom Standard abgeleitetes QtWidgets.QGraphicsView(), in dessen QGraphicsScene ich ein QtSvg.QGraphicsItem() einfüge. Der Code sieht so aus:

    class MyGraphicsView(QtWidgets.QGraphicsView):
    
        def __init__(self, parent):
            super().__init__(parent)
            self._scene = QtWidgets.QGraphicsScene(self)
            self._renderer = QtSvg.QSvgRenderer()
            self.setScene(self._scene)
    
    def load_map(self):
        # set graphic scene - renderView ist vom Typ »MyGraphicsView()«
        _scene = self.ui.renderView._scene
        _scene.setSceneRect(0, 0, 8000, 8000)
        # SVG Image - self.SVG_Image enthält den Pfad zur SVG-Graphic
        _svg_item = QtSvg.QGraphicsSvgItem(self.SVG_Image)
        _scene.addItem(_svg_item)
        #
        self.ui.renderView.fitInView(_svg_item, Qt.KeepAspectRatio)
    
    

    Ich habe nach den Warnungen gesucht, aber leider kein für mich brauchbares Ergebnis gefunden. Habe lediglich gefunden, wie ich mit einer Umgebungsvariablen die Meldungen unterdrücken kann, aber das Ergebnis fand ich nicht wirklich hilfreich ;-)

    Kann mir jemand von euch helfen was ich tun kann, dass die SVG-Graphic sauber dargestellt wird? Kann es ggf. sein, dass Qt mit sehr großen SVG-Graphiken Probleme hat? Meine 8000x8000 große SVG-Graphik hat ca. 20 MB, aber die Probleme sind auch bei kleiner gerenderten SVG-Graphiken, z.B. 800x600 Pixel.

    Danke im voraus und viele Grüße, Hendrik.


  • Moderators

    @___Hendrik___123
    der Qt SVG renderer/interpreter unterstützt einfach nicht alle Features. Insbesondere hat er Probleme mit styling.
    Wenn du QtSvg verwenden willst wird dir nichts anderes übrig bleiben als das generierte SVG an sich zu ändern.



  • @raven-worx
    Danke für deine Antwort! Ich muss nicht unbedingt QtSvg verwenden, gibt es ggf. Alternativen die du mit empfehlen kannst und die die Probleme nicht haben?


  • Moderators

    @___Hendrik___123
    persönlich habe ich keine Empfehlung.
    Aber eine google suche hat z.B. folgendes Ergebnis gebracht: librsvg (oder irgendeine andere 3rdparty lib)
    k.A. was deine Anforderungen sind, aber könnte ein wenig umständlich sein unter Windows.



  • @raven-worx
    Danke, ich schaue mir die Libs mal an. Die Anforderungen sind, dass das SVG so aussieht wie ich es gerendert habe und mit Windows habe ich bei dieser Sache glücklicherweise nix zu tun ;-)


Log in to reply