我尝试在qgis中制作插件,但出现了问题。
当我将代码放入插件下的python控制台时,这有效:

  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)


另一面,当我通过“ plugin 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)


然后当我尝试使用插件时:

IndexError: list index out of range


为什么在控制台中可以工作但在插件中不工作?

最佳答案

只是寻找什么返回qgis.utils.iface.legentInterface().layers()

如果您在插件中,则这不是访问iface的方法,因为它是在插件初始化时作为参数传递的。

无论如何,不​​建议使用legendInterface,并且您应该使用图层注册表来执行此操作。

QgsMapLayerRegistry.instance().mapLayers()将返回所有层的字典,或者mapLayer(my_layer_id)将返回适当的层。

关于python - Qgis:IndexError:列表索引超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40673752/

10-12 22:45