5 votos

QgsVectorLayer problema de setRenderer con referencias persistentes al renderizador antiguo

Tengo un stand-alone pyqgis aplicación que puede mostrar los datos vectoriales. He implementado una rutina que establece la capa de procesador de la siguiente manera:

def set_sym(layer):
    symbol = QgsMarkerSymbolV2.createSimple({})
    symbol_layer = QgsSimpleMarkerSymbolLayerV2()
    symbol_layer.setColor(QColor(0, 0, 0, 255))
    symbol_layer.setName('circle')
    symbol_layer.setSize(1.0)
    symbol.appendSymbolLayer(symbol_layer)
    renderer = QgsSingleSymbolRendererV2(symbol)
    layer.setRendererV2(renderer)

Funciona. Sin embargo, si me llaman de un segundo tiempo en una capa, a continuación, vaya inmediatamente a la salida del programa, se cuelga & tengo que matar el fondo de python proceso para salir de ella. Ya he comprobado que el recién creado renderer y la capa.rendererV2() son diferentes y su símbolo() también son diferentes (me refiero a las direcciones de memoria son diferentes). Así que, me hace pensar que el setRendererV2() de rutina no es la sustitución del representador limpiamente, de ahí colgando en el programa al dejar de fumar justo después de la segunda llamada en la misma capa. Por favor, hágamelo saber si hay algo de lo perdido que provocó esto.

2voto

Geoffrey Puntos 228

Tal vez hay algunos problemas con:

 symbol = QgsMarkerSymbolV2.createSimple({})
 

Corrí este código muchas veces y QGIS no se bloqueó:

 from PyQt4.QtGui import QColor

layer = iface.activeLayer() # load the layer as you want
symbol = QgsMarkerSymbolV2.defaultSymbol(layer.geometryType())
symbol_layer = QgsSimpleMarkerSymbolLayerV2()
symbol_layer.setColor(QColor(0, 0, 0, 255))
symbol_layer.setName('circle')
symbol_layer.setSize(1.0)
symbol.appendSymbolLayer(symbol_layer)
renderer = QgsSingleSymbolRendererV2(symbol)
layer.setRendererV2(renderer)
layer.triggerRepaint()
 

2voto

Stefan Goldmann Puntos 11

La solución es deseleccionar la capa activa que se pasa a la rutina justo después del cambio de simbología. Esto romperá las referencias persistentes al salir del programa.

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