[Qgis-developer] PyQGIS: Problems with the layerWasAdded SIGNAL
Germán Carrillo
carrillo.german at gmail.com
Tue Jun 16 10:44:05 EDT 2009
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't exists.
Germán
El 16 de junio de 2009 6:51, Martin Dobias <wonder.sk at gmail.com> escribió:
> 2009/6/16 Germán Carrillo <carrillo.german at gmail.com>:
> > Hi Martin.
> >
> > I create the layers like the PyQGIS Wiki says:
> >
> > ( For shapefiles) layer = QgsVectorLayer( layerPath,
> layerInfo.fileName(),
> > layerProvider )
> > Where layerPath is a QFileDialog result and layerProvider is "ogr".
> >
> > If the layer is valid, I call a function to add it to canvas:
> >
> > if layer.isValid():
> > self.agregarCapa( layer )
> >
> > def agregarCapa( self, capa ):
> > QgsMapLayerRegistry.instance().addMapLayer( capa )
> > self.layers.insert( 0, QgsMapCanvasLayer( capa ) )
> > self.canvas.setLayerSet( self.layers )
> >
> > I remove layers from the Legend class:
> > for i in self.layers:
> > if i.layer().getLayerID() == self.currentItem().layerId:
> > self.layers.remove( i )
> > QgsMapLayerRegistry.instance().removeMapLayer(
> > i.layer().getLayerID() )
> > self.canvas.setLayerSet( self.layers )
> > break
> >
> > Then I remove the QTreeWidgetItem:
> > self.takeTopLevelItem( self.indexOfTopLevelItem( myItem ) )
> >
> > Like in the QGIS legend, I have an item for the layer name and its
> geometry
> > type and a child item for its symbology.
> > The parent item (the layer item) has the attribute canvasLayer to
> reference
> > it and access its functions and attributes.
> >
> > I'm using this connect line:
> > self.connect( QgsMapLayerRegistry.instance(),
> > SIGNAL("layerWasAdded(QgsMapLayer *)"), self.legend.addLayerToLegend )
> >
> > The legend has another connect line to update the layer status:
> > self.connect( self, SIGNAL("itemChanged(QTreeWidgetItem *,int)"),
> > self.updateLayerStatus )
> >
> > When all it's ok, remove layer always returns two lines like this:
> > Object::disconnect: Unexpected null parameter
>
> I think I know where's the problem: you remove the map layer and then
> update layer set in canvas. When updating the layer set, the layers
> which have been removed get disconnected from the slots of map canvas.
> But that time your layer doesn't exist anymore and the pointer is
> invalid - thus the disonnect warning or a crash.
>
> So the solution should be to swap those two lines. Another way would
> be to connect to registry's layerWillBeDeleted signal (which is
> emitted in removeMapLayer() method when the layer still exists) and
> update the GUI and canvas. This would be a bit cleaner solution if
> there were more places in code where you remove a layer.
>
> Martin
>
--
-----------
|\__
(:>__)(
|/
Soluciones Geoinformáticas Libres
http://geotux.tuxfamily.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/qgis-developer/attachments/20090616/332ff203/attachment.html
More information about the Qgis-developer
mailing list