Thanks Martin, but I remove the layer from the layerSet before removing from QgsMapLayerRegistry. So, when I update the layer set in canvas, the layer doesn&#39;t exists.<br><br>Germán<br><br><br><div class="gmail_quote">El 16 de junio de 2009 6:51, Martin Dobias <span dir="ltr">&lt;<a href="http://wonder.sk">wonder.sk</a>@<a href="http://gmail.com">gmail.com</a>&gt;</span> escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">2009/6/16 Germán Carrillo &lt;<a href="mailto:carrillo.german@gmail.com">carrillo.german@gmail.com</a>&gt;:<br>

<div><div></div><div class="h5">&gt; Hi Martin.<br>
&gt;<br>
&gt; I create the layers like the PyQGIS Wiki says:<br>
&gt;<br>
&gt; ( For shapefiles)  layer = QgsVectorLayer( layerPath, layerInfo.fileName(),<br>
&gt; layerProvider )<br>
&gt; Where layerPath is a QFileDialog result and layerProvider is &quot;ogr&quot;.<br>
&gt;<br>
&gt; If the layer is valid, I call a function to add it to canvas:<br>
&gt;<br>
&gt;   if layer.isValid():<br>
&gt;     self.agregarCapa( layer )<br>
&gt;<br>
&gt;   def agregarCapa( self, capa ):<br>
&gt;     QgsMapLayerRegistry.instance().addMapLayer( capa )<br>
&gt;     self.layers.insert( 0, QgsMapCanvasLayer( capa ) )<br>
&gt;     self.canvas.setLayerSet( self.layers )<br>
&gt;<br>
&gt; I remove layers from the Legend class:<br>
&gt;     for i in self.layers:<br>
&gt;       if i.layer().getLayerID() == self.currentItem().layerId:<br>
&gt;         self.layers.remove( i )<br>
&gt;         QgsMapLayerRegistry.instance().removeMapLayer(<br>
&gt; i.layer().getLayerID() )<br>
&gt;         self.canvas.setLayerSet( self.layers )<br>
&gt;         break<br>
&gt;<br>
&gt; Then I remove the QTreeWidgetItem:<br>
&gt;         self.takeTopLevelItem( self.indexOfTopLevelItem( myItem ) )<br>
&gt;<br>
&gt; Like in the QGIS legend, I have an item for the layer name and its geometry<br>
&gt; type and a child item for its symbology.<br>
&gt; The parent item (the layer item) has the attribute canvasLayer to reference<br>
&gt; it and access its functions and attributes.<br>
&gt;<br>
&gt; I&#39;m using this connect line:<br>
&gt; self.connect( QgsMapLayerRegistry.instance(),<br>
&gt; SIGNAL(&quot;layerWasAdded(QgsMapLayer *)&quot;), self.legend.addLayerToLegend )<br>
&gt;<br>
&gt; The legend has another connect line to update the layer status:<br>
&gt;   self.connect( self, SIGNAL(&quot;itemChanged(QTreeWidgetItem *,int)&quot;),<br>
&gt; self.updateLayerStatus )<br>
&gt;<br>
&gt; When all it&#39;s ok, remove layer always returns two lines like this:<br>
&gt; Object::disconnect: Unexpected null parameter<br>
<br>
</div></div>I think I know where&#39;s the problem: you remove the map layer and then<br>
update layer set in canvas. When updating the layer set, the layers<br>
which have been removed get disconnected from the slots of map canvas.<br>
But that time your layer doesn&#39;t exist anymore and the pointer is<br>
invalid - thus the disonnect warning or a crash.<br>
<br>
So the solution should be to swap those two lines. Another way would<br>
be to connect to registry&#39;s layerWillBeDeleted signal (which is<br>
emitted in removeMapLayer() method when the layer still exists) and<br>
update the GUI and canvas. This would be a bit cleaner solution if<br>
there were more places in code where you remove a layer.<br>
<font color="#888888"><br>
Martin<br>
</font></blockquote></div><br><br clear="all"><br>-- <br>-----------<br>   |\__  <br>(:&gt;__)(<br>   |/    <br><br>Soluciones Geoinformáticas Libres                            <br><a href="http://geotux.tuxfamily.org/">http://geotux.tuxfamily.org/</a><br>
<br>