我尝试在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/