6 votos

Rareza de PyQGIS señal llamada

He hecho un pequeño plugin de QGIS, y me dieron algunos resultados extraños. El programa ahora refleja el "Panel " Capas". Al añadir o eliminar capas en el Panel de la QListWidget módulo de obtener los nombres de las capas. He conectado la función a la legendLayersAdded y layersRemoved de la SEÑAL.

EL PROBLEMA: El agregar la parte está bien, y si puedo eliminar UNA capa, que también está bien. Pero si puedo quitar varias capas, el widget se pone de nuevo el resto de las capas de los nombres de los múltiples veces (número de quitarse capas).

La comunidad edit: Para sin embargo, muchas de múltiples capas son removidos, el resto de las capas aparecen en la lista que muchas veces. Ergo, si 3 capas se quitan, y hay 1 restantes, la capa que aparece 3 veces en la capa adicional panel:

image of the issue

Es como la señal de llama a la función de forma recursiva!? He intentado con el layerWasRemoved de la Señal y el resultado fue el mismo Hice un video de él, porque es difícil de explicar.

[https://www.youtube.com/watch?v=NuLtANtlLtE&feature=youtu.be]

Aquí está el código:

def ablak(self):
layers = [] 
self.dockwidget.telepules_kezelo.clear()
layers = self.iface.legendInterface().layers()
print "Befor" # Befor layer list
print layers # Layer list "from Layers Panel"
print "After" # After layer list
i = 0 # Just a counter for debubing
lista = self.dockwidget.telepules_kezelo
for layer in layers:
    print layer.name()
    lista.addItem(layer.name())
    i = i+1
    print i # Counter for debuging
layers = []


QgsMapLayerRegistry.instance().legendLayersAdded.connect(self.ablak)

QgsMapLayerRegistry.instance().layersRemoved.connect(self.ablak)

Yo fade out el problema con la transferencia de la self.dockwidget.telepules_kezelo.clear() línea después de la Print After línea. Y funciona bien, pero estoy muy frustrado con ella.

4voto

Mue Puntos 2469

Creo que su función puede ser acortado hacia abajo un poco como han definido las listas pero no usarlas (al menos no lo han demostrado).

La siguiente función hace lo siguiente cuando una capas es añadido o eliminado (según lo sugerido por @coneypylon):

  • Borra el widget
  • Sólo agrega las capas actualmente cargadas en el panel

(Probado en QGIS 2.18.2):

def ablak(self):
    self.dockwidget.telepules_kezelo.clear()
    for layer in QgsMapLayerRegistry.instance().mapLayers().values():            
        self.dockwidget.telepules_kezelo.addItem(layer.name())

QgsMapLayerRegistry.instance().legendLayersAdded.connect(self.ablak)
QgsMapLayerRegistry.instance().layersRemoved.connect(self.ablak)

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