PyQGIS LayerTreeViewのサンプル


どんな動きをするの?

f:id:Chiakikun:20200611220049p:plain

レイヤウィンドウでレイヤを選択する度に...

 

f:id:Chiakikun:20200611220102p:plain

選択されていたレイヤ名と、現在選択されているレイヤ名がPythonコンソールに表示されます。


コード

import qgis
from qgis.core import *
from qgis.gui  import *
from PyQt5.Qt import QObject, pyqtSignal

class LayerTreeViewSample(QObject): # signal-slot使いたいので
    cleared = pyqtSignal()

    def changeLayer(self, layer):

        if (layer == None): # レイヤウィンドウに何も無い状態
            self.currentlayer = None
            self.cleared.emit()
            return

        if self.currentlayer != None:
            print(self.currentlayer.name() + 'が非アクティブになりました。')

        print(layer.name()+'がアクティブになりました。')
        self.currentlayer = layer


    def __init__(self, iface):
        super(LayerTreeViewSample, self).__init__()

        self.iface = iface

        self.currentlayer = self.iface.layerTreeView().currentLayer()
        self.iface.layerTreeView().currentLayerChanged.connect(self.changeLayer)


    def __del__(self):
        self.iface.layerTreeView().currentLayerChanged.disconnect(self.changeLayer)

ソースはこちら


使い方

例として、ここからダウンロードできるサンプルプラグインに追加します。

nodialog_skelton.pyと同じフォルダにソースを置いて、インポート部分に次のコードを追記します。

from .layertreeviewsample import LayerTreeViewSample

nodialog_skelton.pyのstartを次のコードに書き換えます。

    def start(self):
        self.lt = LayerTreeViewSample(self.iface)
        self.lt.cleared.connect(self.clear)

nodialog_skelton.pyのfinishを次のコードに書き換えます。

    def finish(self):
        self.lt = None

次のメソッドを追加してください。

    def clear(self):
        self.lt = None
        self.action.setChecked(False)

def clear(self): self.lt = None self.action.setChecked(False)

このようになればOKです。

~略~

from .layertreeviewsample import LayerTreeViewSample


class NodialogSkelton(qgis.gui.QgsMapTool):

    def clear(self):
        self.lt = None
        self.action.setChecked(False)


    def start(self):
        self.lt = LayerTreeViewSample(self.iface)
        self.lt.cleared.connect(self.clear)
        
        
    def finish(self):
        self.lt = None
~略~

ありがとうございました。