2016-11-18 29 views
1

私はqgisでプラグインを作成しようとしましたが、問題があります。Qgis:IndexError:リストのインデックスが範囲外になっています

def Style_for_layer(): 
    layer = qgis.utils.iface.legendInterface().layers()[0] 
    if layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Point and layer.name() in ["one","two"]: 
     layer.loadNamedStyle('C:/Users/user/Desktop/style_one.qml') 
    elif layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Line and layer.name() == "some name layer": 
    layer.loadNamedStyle('C:/Users/user/Desktop/style_two.qml') 
    else: 
      pass 
    legend = qgis.utils.iface.legendInterface() 
    legend.itemAdded.connect(Style_for_layer) 

反対側を、私は「プラグインbuildier」これは動作しないことにより、プラグインを集約したときに:私が使用プラグインをしようとすると、その後

def run(self): 
     """Run method that performs all the real work""" 
     # show the dialog 
     #self.dlg.show() 
     # Run the dialog event loop 
     #result = self.dlg.exec_() 
     # See if OK was pressed 
     #if result: 
    layer = qgis.utils.iface.legendInterface().layers()[0] 
    if layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Point and layer.name() in ["one","two"]: 
      layer.loadNamedStyle('C:/Users/user/Desktop/style_one.qml') 
    elif layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Line and layer.name() == "some name layer": 
      layer.loadNamedStyle('C:/Users/user/Desktop/style_two.qml') 
    else: 
     pass  
    legend = qgis.utils.iface.legendInterface() 
    legend.itemAdded.connect(run) 

私は下のpythonコンソールにコードを置くのプラグインこの作品 :

IndexError: list index out of range 

コンソールでは動作しますが、プラグインでは機能しないのはなぜですか?

答えて

1

返品についてはqgis.utils.iface.legentInterface().layers()をご覧ください。

プラグインを使用している場合は、プラグインの初期化時に引数として渡されるため、これはifaceにアクセスする方法ではありません。

とにかく、legendInterfaceは推奨されていません。これを行うには、レイヤレジストリを使用する必要があります。

QgsMapLayerRegistry.instance().mapLayers()すべてのレイヤーの辞書を返すか、mapLayer(my_layer_id)が適切なレイヤーを返します。

関連する問題