Ich habe einige Ebenen mit sehr komplexen datendefinierten Symbolen. Wenn ich im Print Composer eine Legende verwende, werden diese Symbole nicht richtig gezeichnet.
Gibt es eine Möglichkeit, die Legenden-Symbole mit Pyqgis zu ändern, sodass ich benutzerdefinierte PNG- oder SVG-Bilder anstelle des Standard-Legenden-Symbols für diese Ebenen verwenden kann?
Ich weiß, wie man dem Druckkomponisten einen Druckknopf hinzufügt und wie man ihn mit einer Funktion verbindet. Ich möchte den Legendeneinstellungen eine Schaltfläche hinzufügen, damit ich das automatisch generierte Legenden-Symbol durch ein benutzerdefiniertes Bild ersetzen kann. Was ich also noch brauche, ist die Information, wie ich mit pyqgis / pyqt auf die Legenden-Symbole zugreifen kann und wie ich sie durch ein QImage auf einem QLabel oder so etwas ersetzen kann?
Sehr einfaches Modell der Schaltfläche zum Ändern des Symbols:
Automatisch generierte Legende:
Legende mit benutzerdefiniertem Legenden-Symbol:
Ich habe bereits herausgefunden, wie ich auf die Elemente der Legende im Druckkomponisten zugreifen kann, aber noch nicht, wie ich auf das Symbol selbst zugreifen kann:
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()
Bearbeiten 1:
Ich habe auch herausgefunden, wie man auf QIcon-Objekte des Legendenbaums zugreift, kann sie aber noch nicht austauschen:
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()
Hier ist ein Beispiel aus dem wirklichen Leben, in dem Sie eine Symbologie sehen können, die aus vielen Symbolebenen kombiniert ist: Dies endet in der Legende wie folgt:
Da ich das richtige Symbol in der Legende benötige, möchte ich einen Screenshot meines Symbols erstellen, es zuschneiden und als Bild in meiner Legende verwenden.
Ich weiß, dass ich einfach ein separates Bild über meine Legende legen könnte, das das automatisch generierte Symbol abdeckt, aber ich hätte gerne eine "sauberere" Lösung, mit der ich die Symbole in der Legende durch benutzerdefinierte Bilder ersetzen kann.
Bearbeiten 2:
In der Zwischenzeit habe ich einen anderen Weg gefunden, um auf die Legendeneinträge zuzugreifen:
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)
Dadurch kann ich auf die QgsLayerTreeLayer-Objekte zugreifen und den Legendenstil (Gruppe, Untergruppe, Versteckt) wechseln. Aber ich habe immer noch keine Ahnung, wie ich auf das Legenden-Symbol zugreifen soll. Irgendwelche Ideen?