非常に複雑なデータ定義シンボルを含むレイヤーがいくつかあります。Print Composerで凡例を使用すると、これらの記号が正しく描画されません。
pyqgisで凡例シンボルを変更する方法はありますか?したがって、これらのレイヤーのデフォルトの凡例シンボルの代わりにカスタムのPNGまたはSVG画像を使用できますか?
Print Composerにプッシュボタンを追加する方法と、それを関数に接続する方法を知っています。Legend-Settingsにボタンを追加して、自動生成された凡例アイコンをカスタム画像に置き換えることができるようにしたいと思います。だから私がまだ必要なのは、どのようにしてpyqgis / pyqtで凡例シンボルにアクセスできるか、そしてそれらをQLabelなどのQImageで置き換える方法の情報ですか?
シンボルの変更に使用されるボタンの非常に基本的なモックアップ:
自動生成された凡例:
カスタム凡例記号付きの凡例:
Print Composerで凡例のアイテムにアクセスする方法はすでにわかっていますが、シンボル自体にアクセスする方法はまだわかりません。
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()
編集1:
また、legend-treeのQIcon-Objectsにアクセスする方法も見つけましたが、まだスワップできません。
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()
これは、多くのシンボルレイヤーの組み合わせのシンボルを見ることができる実際の例です。 これは、次のような凡例になります。
凡例に適切なシンボルが必要なため、シンボルのスクリーンショットを作成し、トリミングして、凡例の画像として使用します。
自動生成されたシンボルをカバーする別の画像を凡例の上に重ねることができることはわかっていますが、凡例のシンボルをカスタム画像に置き換えることができる「よりクリーンな」ソリューションが欲しいです。
編集2:
その間に、凡例のエントリにアクセスする別の方法を見つけました。
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)
これにより、QgsLayerTreeLayerオブジェクトにアクセスでき、凡例のスタイル(グループ、サブグループ、非表示)を切り替えることができます。しかし、レジェンドシンボルにアクセスする方法はまだわかりません。何か案は?