[QGIS-Developer] RuntimeError: wrapped C/C++ object of type QgsVectorLayer has been deleted

Benjamin Jakimow benjamin.jakimow at geo.hu-berlin.de
Thu May 4 00:21:04 PDT 2023


Hi Luke,

to my experience the "RuntimeError: wrapped C/C++ object of type 
QgsVectorLayer has been deleted" is raised when the C++ QgsVectorLayer 
has been deleted by a parent class.
This is often a QgsMapLayerStore, for example the 
QgsProject.instance().mapLayerStore(), from which a layer gets removed 
when it is removed from the layer tree.

In that case your self.aoi_layer python reference still exists, but not 
the underlying C++ object.

You could ensure that the aoi_layer is not removed from the layer store 
it is stored in, for example using QgsLayerStore::takeMapLayer(layer) 
instead QgsLayerStore::removeMapLayer(layer).
Or save the aoi_layer_id and test in your eventFilter, if the aoi_layer 
instance still exists:

aoi_layer = self.project().mapLayers().get(self.aoi_layer_id)

if isinstance(aoi_layer, QgsMapLayer):
    aoi_layer_data_provider = aoi_layer.dataProvider()

   ...


Greetings,

Benjamin

Am 04.05.2023 um 04:46 schrieb Catania, Luke A ERDC-RDE-GRL-VA CIV via 
QGIS-Developer:
>
> I am trying to understand the general meaning of the message below.
>
> RuntimeError: wrapped C/C++ object of type QgsVectorLayer has been deleted
>
> I step through my code in the debugger and at some point my variable, 
> aoi_layer, is longer assigned to a specific vector layer, though the 
> value comes back as QgsVectorLayer since I have a watch on it.  I 
> though maybe somehow it got set to “None”, but it’s not None.
>
> I’d like to post code, but I’d have way to much code to post.  I am 
> basically trying to override the map canvas events with an eventFIlter 
> while I go through a drawing process.  I want a particular action to 
> occur when I right click on the map canvas.  I am trying to override 
> the map canvas from completing a drawing of a shape if the shape is 
> too small, but it does not seem to override it. The shape is completed 
> when I right click, so it seems like I have not overridden the event 
> even though I capture the event using the code below:
>
>     def eventFilter(self, source, event):
>
>           if event.type() == QEvent.MouseButtonPress and 
> event.button() == Qt.RightButton:
>
>                         if self.valid_size(self.aoi_area):
>
> aoi_layer_data_provider = self.aoi_layer.dataProvider()
>
> self.aoi_feature.setGeometry(self.aoi_geometry)
>
> aoi_layer_data_provider.addFeatures([self.aoi_feature])
>
> self.aoi_layer.commitChanges()
>
> self.aoi_layer.setExtent(self.aoi_feature.geometry().boundingBox())
>
> self.add_area_perimeter()
>
> self._refresh_and_zoom_to_layer(True)
>
> self.AOI_SIZE_VALIDATOR_LABEL.close()
>
> self.track_cursor = False
>
> iface.mapCanvas().viewport().removeEventFilter(self)
>
>     Return False
>
> I initially had the return to be “return super().eventFilter(source, 
> event)”
>
> So the shape is completed and it adds it to the layer that is open for 
> editing.  My function allows the drawing to continue because my check 
> indicates the shape is not large enough so the commit should not 
> happen unless the size is valid.
>
> I can continue drawing but I right click on the map canvas it 
> completes the drawing a second time, so now I have two rectangles, 
> both with the same start position, but one larger than the other.  It 
> is when I create a second layer to draw that I get the runtime error.
>
> So I have two problems.  I don’t seem to be completely overriding the 
> build in event handler and QGIS is still completing the drawing when I 
> right click. And somehow this may be contributing to the runtime error.
>
> If I can understand in general how my object is deleted when I don’t 
> have any statement that deletes the object maybe I can figure it out 
> the second issue.
>
>
> _______________________________________________
> QGIS-Developer mailing list
> QGIS-Developer at lists.osgeo.org
> List info:https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe:https://lists.osgeo.org/mailman/listinfo/qgis-developer

-- 
Dr. Benjamin Jakimow
Earth Observation Lab | Geography Department | Humboldt-Universität zu Berlin

e-mail:benjamin.jakimow at geo.hu-berlin.de
web:https://hu-berlin.de/eo-lab
phone:  +49 (0) 30 2093 6846
mobile: +49 (0) 157 5656 8477
fax:    +49 (0) 30 2093 6848
mail:   Unter den Linden 6 | 10099 Berlin | Germany
room: 2'211
linkedin:https://www.linkedin.com/in/benjamin-jakimow
matrix: @jakimowb:hu-berlin.de
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20230504/42da30c7/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4745 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20230504/42da30c7/attachment-0001.bin>


More information about the QGIS-Developer mailing list