J'ai quelques couches avec des symboles définis par les données très complexes. Si j'utilise une légende dans le compositeur d'impression, ces symboles ne sont pas dessinés correctement.
Existe-t-il un moyen de modifier les symboles de légende avec des pyqgis, donc je peux utiliser des images PNG ou SVG personnalisées au lieu du symbole de légende par défaut pour ces couches?
Je sais comment ajouter un bouton-poussoir au composeur d'impression et comment le connecter à une fonction. Je veux ajouter un bouton aux paramètres de légende pour me permettre de remplacer l'icône de légende générée automatiquement par une image personnalisée. Donc, ce dont j'ai encore besoin, c'est de savoir comment accéder aux symboles de légende avec pyqgis / pyqt, et comment les remplacer par un QImage sur un QLabel ou quelque chose comme ça?
Maquette très basique du bouton utilisé pour changer le symbole:
Légende générée automatiquement:
Légende avec symbole de légende personnalisé:
J'ai déjà découvert comment accéder aux éléments de la légende dans le compositeur d'impression mais pas encore comment accéder au symbole lui-même:
import qgis
from PyQt4.QtCore import *
from PyQt4.QtGui import *
activeComposer = iface.activeComposers()
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
#print i
#print i.model()
legend = i
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
print posteleg.data()
Modifier 1:
J'ai également découvert comment accéder aux objets QIcon de l'arbre de légende, mais je ne peux pas encore les échanger:
def run(self):
activeComposer = self.iface.activeComposers()
#print(self.resolve('icon.png'))
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
legend = i
layerIcon = QIcon(os.path.join(os.path.dirname(__file__), "icon.png"))
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
posteleg.model().iconGroup().swap(layerIcon)
print posteleg.data()
Voici un exemple réel où vous pouvez voir une symbologie combinée de plusieurs couches de symboles: Cela se retrouvera dans la légende comme ceci:
Comme j'ai besoin du bon symbole dans la légende, je voudrais faire une capture d'écran de mon symbole, le recadrer et l'utiliser comme image dans ma légende.
Je sais que je pourrais simplement superposer une image distincte au-dessus de ma légende qui couvre le symbole généré automatiquement, mais j'aimerais avoir une solution "plus propre" qui me permette de remplacer les symboles de la légende par des images personnalisées.
Modifier 2:
En attendant, j'ai trouvé un autre moyen d'accéder aux entrées de la légende:
from qgis.core import QgsLegendRenderer, QgsComposerLegendStyle
compDict = {}
for comp in iface.activeComposers():
# workaround to get name: read it from window title
compDict[comp.composerWindow().windowTitle()] = comp.composition()
if "mycomposername" in compDict:
itemLlegend = compDict["mycomposername"].getComposerItemById("mylegend_id")
if itemLlegend:
print itemLlegend
tree_layer_layer = itemLlegend.modelV2().rootGroup().children()
for item in tree_layer_layer:
if item.layerName()=="MyLayername":
print "match"
QgsLegendRenderer.setNodeLegendStyle(item, QgsComposerLegendStyle.Group)
Cela me permet d'accéder aux objets QgsLayerTreeLayer et je peux changer le style de légende (Group, Subgroup, Hidden). Mais je ne sais toujours pas comment accéder au symbole de légende. Des idées?