[PYTHON] Ist Qt nicht die stärkste Bibliothek für die einfache Ausgabe von SVG?

Ich habe untersucht, wie eine SVG-Datei mit Python ausgegeben wird, aber Qt (PySide) ist einfacher als die stärkste SVG-Bibliothek von Python svgwrite. Dann kam ich zu dem Schluss, dass es das stärkste sein könnte (ich gebe den Einwand zu).

Was ist SVG?

Ich glaube nicht, dass die meisten Leute SVG kennen, aber ich werde es vorerst erklären.

SVG ist eines der typischen Vektorbildformate. Im Vergleich zum herkömmlichen Bild im Rasterformat gibt es auch bei Vergrößerung oder Verkleinerung des Bildes kein Zacken, sodass eine schöne Anzeige auch an Orten erzielt werden kann, an denen die Anzeigegröße je nach Umgebung schwankt, z. B. bei einem Webbrowser.

Ausgabe von SVG mit Qt

Der QSvg-Generator wird für die SVG-Ausgabe mit Qt (PySide) verwendet. Schauen wir uns ein einfaches Beispiel an, das SVG mit PySide ausgibt.

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtSvg import *

app = QApplication(sys.argv)

svg_gen = QSvgGenerator()
svg_gen.setFileName("hello.svg")
svg_gen.setSize(QSize(200, 80))
svg_gen.setViewBox(QRect(0, 0, 200, 80))
svg_gen.setTitle("hello svg")
svg_gen.setDescription("this is sample svg.")

painter = QPainter()
painter.begin(svg_gen)

rect = QRect(0, 0, 200, 80)
painter.fillRect(rect, Qt.yellow)

painter.setPen(Qt.blue)
painter.setFont(QFont("Arial", 30))
painter.drawText(rect, Qt.AlignCenter, "Hello SVG")

painter.end()

Ergebnis anzeigen (* Wird in PNG angezeigt, da SVG nicht eingefügt werden kann.) g5039.png

Bitte beachten Sie, dass nur die SVG-bezogenen Module mit `aus PySide.QtSvg import *` importiert werden.

Sie müssen lediglich die SVG-Einstellungen in den QSvg-Generator eingeben und dann wie gewohnt mit QPainter zeichnen. Ich habe die Elemente von SVG überhaupt nicht manipuliert, aber dies allein erstellt eine SVG-Datei. (Natürlich handelt es sich nicht um eine vollständige SVG-Konvertierung, und Funktionen, über die SVG nicht verfügt, wie z. B. Textumbruch, werden ignoriert.)

SVG-Zeichnungen können übrigens auch in QGraphicsView mit QSvgWidget oder QGraphicsSvgItem angezeigt werden.

SVG-Ausgabe von QGraphicsScene (2017-01-05 postscript)

Die SVG-Ausgabe ist auch über QGraphicsScene möglich.

scene = QGraphicsScene()

rect = QRect(0, 0, 200, 80)

scene.setSceneRect(rect)
scene.addRect(rect, QPen(Qt.transparent), QBrush(Qt.yellow))
text_item = scene.addText("Hello SVG", QFont("Arial", 30))
text_item.setDefaultTextColor(Qt.blue)

painter = QPainter()
painter.begin(svg_gen)

scene.render(painter)

painter.end()

Es ist wichtig, dass QGraphicsScene ausgegeben werden kann. Sie können die Elementposition mit einer Maus usw. in QGraphicsView anpassen und so wie sie ist in SVG ausgeben. Sie können ganz einfach eine Live-Vorschau-Umgebung für SVG erstellen.

Vorteil gegenüber svgwrite

svgwrite ist eine flexible und sehr benutzerfreundliche Bibliothek. Ich möchte jedoch die Überlegenheit gegenüber svgwrite im Vergleich zur Verwendung von Qt erwähnen.

svgwrite hat keine getBBox

Da svgwrite ein Wrapper für XML ist, zum Guten oder zum Schlechten, gibt es keine getBBox, die bei der Anzeige nach einem Kopfgeldfeld fragt. Dies ist beim Umgang mit Text sehr problematisch, da Sie die Größe des Textes nicht kennen.

Keine Kenntnis der SVG-Elemente erforderlich

Da SVG ausgegeben wird, ist es natürlich erforderlich, dass Kenntnisse über Elemente erforderlich sind. Mit Qt kann SVG jedoch ohne Kenntnisse über Elemente ausgegeben werden.

Einfache Vorschau des Erstellungsprozesses

Wenn Sie SVG im Programm ausgeben möchten, ist try & error erforderlich. Wenn Sie Qt verwenden, wird die Zeichnung von QPainter so wie sie ist zu SVG, sodass die Vorschauumgebung unweigerlich abgeschlossen ist. Auch nach der Konvertierung in SVG können Sie dies mit QSvgWidget überprüfen. Sobald Sie ein Programm erstellt haben, können Sie es gleichzeitig mit der Live-Vorschau ändern und erstellen.

Über die Version von SVG

Beachten Sie, dass die SVG-Version 1.2 ist, was von Qt5 verarbeitet werden kann, die SVG-Version jedoch 1.1, da es sich bei Verwendung von PySide um Qt4.8 handelt. Ich hoffe nur, dass PySide 2 so bald wie möglich offiziell veröffentlicht wird.

Zusammenfassung

Die Ausgabe von SVG mit Qt ist sehr einfach. Wenn Sie Qt kennen, müssen Sie SVG nicht kennen, was für SVG-Anfänger ein großer Vorteil ist.

Das Erstellen flexibler SVGs wie das Verknüpfen mit HTML5 und das Anwenden von Stylesheets muss an svgwrite übergeben werden. Qt ist jedoch eine hervorragende Option für SVGs, die nur angezeigt werden.

Verwendung der automatischen SVG-Generierung

Übrigens analysiere ich automatisch die Struktur der C-Sprache und gebe das Blockdiagramm (Ist es der Name?) In SVG aus. Die folgende Abbildung wird für die BITMAPINFOHEADER-Struktur ausgegeben.

g4863.png

Es ist praktisch, es durch automatische Generierung in ein Handbuch wie Sphinx einzubetten, da Sie die Struktur wie das Putten verstehen können.

Recommended Posts

Ist Qt nicht die stärkste Bibliothek für die einfache Ausgabe von SVG?
Wenn Sie möchten, dass Ihre Kollegen dieselbe Sprache verwenden
Ich möchte kühl auf die Konsole ausgeben
Wenn Sie awsebcli in CircleCI aufnehmen möchten, geben Sie die Python-Version an
AssertNumQueries ist nützlich, wenn Sie N + 1-Abfragen einfach mit django testen möchten
Wenn Sie Word Cloud erstellen möchten.
Wenn Sie den Chrome-Treiber aktualisieren möchten.
nb_conda_kernels wird empfohlen, wenn Sie die virtuelle Umgebung mit jupyter betreten möchten
Wenn Sie Cython verwenden möchten, schließen Sie auch python-dev ein
Die Programmiersprache, die Sie verwenden möchten
Wenn Sie ein Argument in die Abschlussfunktion einfügen und später ausführen möchten
Ich möchte initialisieren, wenn der Wert leer ist (Python)
[Python] Wenn Sie plötzlich ein Anfrageformular erstellen möchten
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
Wenn Sie mehrere Versionen derselben Python-Bibliothek verwenden möchten (virtuelle Umgebung mit venv)
[Django] Erklären Sie den Fluchtweg sorgfältig, wenn Sie die Tabelle einer anderen Anwendung wirklich verwenden möchten
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
Wenn Sie die Liste entfernen, die geloopt werden soll, werden Sie schrecklich.
Wenn Sie möchten, dass das Thema Ihrer Sphinx-Dokumentation dasselbe ist
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Wenn Sie einer Variablen in Python einen CSV-Export zuweisen möchten
[TensorFlow] Wenn Sie TensorBoard ausführen möchten, installieren Sie es mit pip.
Was tun, wenn Sie den Papierkorb in Lubuntu 18.04 nicht verwenden können?
So finden Sie heraus, wann Sie das Java-Installationsverzeichnis nicht kennen
Wenn Sie das Intervall der Achsenskala mit APLpy anpassen möchten
Wenn Sie nur die Dump-Datei des Servers abrufen möchten, war es praktisch, einen http-Server zu erstellen
Wenn Sie den Ausführungsbenutzer mitten in einer Fabric-Aufgabe wechseln möchten, stellen Sie den Kontextmanager ein