Qt n'est-il pas la bibliothèque la plus puissante pour une sortie facile de SVG?

J'étudiais comment générer un fichier SVG en Python, mais Qt (PySide) est plus facile que la bibliothèque SVG la plus puissante de python svgwrite. Puis je suis arrivé à la conclusion que ce pourrait être le plus fort (j'admets l'objection).

Qu'est-ce que SVG?

Je ne pense pas que la plupart des gens connaissent SVG, mais je vais l'expliquer pour le moment.

SVG est l'un des formats d'image vectorielle typiques. Par rapport à l'image au format raster conventionnel, il n'y a pas de dentelure même lorsque l'image est agrandie ou réduite, de sorte qu'un bel affichage peut être obtenu même dans les endroits où la taille d'affichage fluctue en fonction de l'environnement, comme un navigateur Web.

Sortie de SVG en utilisant Qt

QSvg Generator est utilisé pour la sortie SVG à l'aide de Qt (PySide). Jetons un coup d'œil à un exemple simple qui produit SVG avec PySide.

#! 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()

Afficher le résultat (* affiché en PNG car SVG ne peut pas être collé) g5039.png

Veuillez noter que seuls les modules liés à SVG sont importés avec from PySide.QtSvg import * ''.

Tout ce que vous avez à faire est de saisir les paramètres SVG dans le générateur QSvg, puis d'utiliser QPainter pour dessiner comme d'habitude. Je n'ai pas du tout manipulé les éléments de SVG, mais cela seul crée un fichier SVG. (Bien sûr, ce n'est pas une conversion SVG complète, et les fonctionnalités que SVG n'a pas, telles que l'habillage de texte, sont ignorées.)

À propos, le dessin SVG peut également être affiché dans QGraphicsView avec QSvgWidget ou QGraphicsSvgItem.

Sortie SVG de QGraphicsScene (PostScript 05/01/2017)

La sortie SVG est également possible à partir de QGraphicsScene.

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()

Il est important que QGraphicsScene puisse être sorti, vous pouvez ajuster la position de l'élément avec une souris, etc. dans QGraphicsView et le sortir en SVG tel quel. Vous pouvez facilement créer un environnement de prévisualisation en direct pour SVG.

Avantage sur svgwrite

svgwrite est une bibliothèque flexible et très facile à utiliser. Cependant, je voudrais mentionner la supériorité sur svgwrite par rapport au cas de l'utilisation de Qt.

svgwrite n'a pas getBBox

Puisque svgwrite est un wrapper pour XML, pour le meilleur ou pour le pire, il n'y a pas de `` getBBox '' qui demande une boîte de prime lors de son affichage. Ceci est très gênant lorsqu'il s'agit de texte car vous ne connaissez pas la taille du texte.

Aucune connaissance des éléments SVG requise

Puisqu'il produit SVG, il est naturel que des connaissances sur les éléments soient nécessaires, mais avec Qt, SVG peut être produit sans aucune connaissance des éléments.

Aperçu facile du processus de création

Si vous voulez sortir SVG sur le programme, essayez et une erreur est requise. Si vous utilisez Qt, le dessin de QPainter devient SVG tel quel, donc l'environnement de prévisualisation est inévitablement terminé. Même après la conversion en SVG, vous pouvez le vérifier avec QSvgWidget, donc une fois que vous avez construit un programme, vous pouvez le modifier et le créer en même temps avec un aperçu en direct.

À propos de la version de SVG

Notez que la version SVG est 1.2, qui peut être gérée par Qt5, mais que la version SVG est 1.1 car elle est Qt4.8 lors de l'utilisation de PySide. J'espère juste que PySide 2 sera officiellement publié dès que possible.

Résumé

La sortie de SVG avec Qt est très simple. Si vous connaissez Qt, vous n'avez pas besoin de connaître SVG, ce qui est un gros avantage pour les débutants en SVG.

La création de SVG flexibles tels que la liaison avec HTML5 et l'application de feuilles de style doit être transférée à svgwrite, mais Qt est une excellente option pour les SVG en affichage uniquement.

Comment utiliser la génération automatique SVG

Au fait, j'analyse automatiquement la structure du langage C et j'envoie le diagramme (est-ce le nom?) En SVG. La figure suivante est sortie pour la structure BITMAPINFOHEADER.

g4863.png

Il est pratique de l'intégrer dans un manuel tel que Sphinx par génération automatique car on peut comprendre la structure telle que la mise.

Recommended Posts

Qt n'est-il pas la bibliothèque la plus puissante pour une sortie facile de SVG?
Si vous souhaitez que vos collègues utilisent la même langue
Je veux sortir froidement sur la console
Si vous souhaitez inclure awsebcli dans CircleCI, spécifiez la version de python
AssertNumQueries est utile si vous souhaitez tester facilement une requête N + 1 avec django
Si vous souhaitez créer Word Cloud.
Lorsque vous souhaitez mettre à jour le pilote Chrome.
[Note] Que faire si la bibliothèque Qt entre en conflit entre pyqt et opencv
nb_conda_kernels est recommandé si vous souhaitez entrer dans l'environnement virtuel avec jupyter
Si vous souhaitez utiliser Cython, incluez également python-dev
Le langage de programmation que vous souhaitez pouvoir utiliser
Si vous voulez mettre un argument dans la fonction de fermeture et l'exécuter plus tard
Je veux initialiser si la valeur est vide (python)
[Python] Si vous souhaitez soudainement créer un formulaire de demande
Keras Je veux obtenir la sortie de n'importe quelle couche !!
[Django] Que faire quand il y a de nombreux champs dans le modèle que vous souhaitez créer
Lorsque vous souhaitez utiliser plusieurs versions de la même bibliothèque Python (environnement virtuel utilisant venv)
[Django] Expliquez soigneusement la voie d'échappement si vous voulez vraiment utiliser la table d'une autre application
Si vous souhaitez devenir data scientist, commencez par Kaggle
N'écrivez pas Python si vous voulez l'accélérer avec Python
Si vous supprimez la liste à mettre en boucle, vous deviendrez terrible.
Lorsque vous souhaitez que le thème de votre documentation Sphinx soit le même
Je veux sortir le début du mois prochain avec Python
Si vous souhaitez affecter une exportation csv à une variable en python
[TensorFlow] Si vous souhaitez exécuter TensorBoard, installez-le avec pip.
Que faire si vous ne pouvez pas utiliser la poubelle dans Lubuntu 18.04.
Comment trouver lorsque vous ne connaissez pas le répertoire d'installation Java
Lorsque vous souhaitez ajuster l'intervalle de l'échelle de l'axe avec APLpy
Si vous souhaitez simplement obtenir le fichier de vidage du serveur, il était pratique de créer un serveur http
Si vous souhaitez changer d'utilisateur d'exécution au milieu d'une tâche Fabric, le gestionnaire de contexte des paramètres