8 votos

Cambiar programáticamente la posición de las capas en el índice (QGIS)

Estoy intentando mover/posicionar una capa al fondo de la TOC usando addTopLevelItem en todas las demás capas. No estoy seguro de cómo referenciar las capas como QTreeWidgetItem's.

def bg_bottom_level_item(self):
    layers = self.canvas.layers()
    layerlist = []
    for layer in layers:
        layerID = str(layer.id())
        if "Auto_Background" not in layerID:
            layerlist.append(layer)
        else:
            pass
    for layer in layerlist:
        leg = qgis.utils.iface.mainWindow().findChild(QTreeWidget, 'theMapLegend')
        item = QTreeWidgetItem(layer)
        leg.addTopLevelItem(item)

Error:

QTreeWidgetItem(QTreeWidgetItem): argument 1 has unexpected type 'QgsRasterLayer'

¿O alguien tiene otra solución para mover las capas en el TOC?

1 votos

6voto

Elliott Maynard Puntos 11

Utilizando el nuevo árbol de capas (también conocido como leyenda o Toc) añadido por Martin Dobias desde QGIS v.2.4, puede cargar una capa en la parte inferior de la TdC siguiendo estos pasos:

  1. Obtener una referencia del árbol de capas

    root = QgsProject.instance().layerTreeRoot()
  2. Crear el objeto de capa

    mylayer = QgsVectorLayer("/Path/to/your/data.shp", "my layer", "ogr")
  3. Añadir la capa al Registro de Capas de Mapa de QGIS

    QgsMapLayerRegistry.instance().addMapLayer(mylayer, False)
  4. Añadir la capa al árbol de capas

    root.addLayer(mylayer)

Si quieres para mover una capa existente a la parte inferior de la TdC Para ello, es necesario conocer el ID de la capa (puede obtenerlo ejecutando root.findLayerIds()). Una vez que obtengas el id de la capa, sigue estos pasos:

a. Igual que el 1.

root = QgsProject.instance().layerTreeRoot()    

b. Obtener la capa por el id

myExistingLayer = root.findLayer("divipola_mpio20141217144143371")

c. Clonarlo (confía en mí)

myClone = myExistingLayer.clone()

d. Añadir el clon al árbol de capas

root.addChildNode(myClone)

e. Obtener el padre de la capa original

parent = myExistingLayer.parent()

f. Eliminar la capa original

parent.removeChildNode(myExistingLayer)

Edición: Ahora los pasos a. a f. deberían funcionar para cualquier capa/grupo independientemente de su posición en la jerarquía del árbol de capas.

0 votos

¿Puede explicar por qué tenemos que clonarlo? He utilizado esta técnica, pero en una revisión de código fue rechazada, ya que estoy clonando.

0 votos

0 votos

El artículo no explica por qué utilizan el clon.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X