[Qgis-developer] QgsRubberBand RuntimeError: underlying C/C++ object has been deleted

Denis Rouzaud denis.rouzaud at gmail.com
Wed Feb 12 22:13:22 PST 2014


Hi Radim,

Can you show us the whole code?

Cheers,

Denis

On 12. 02. 14 19:17, Radim Blazek wrote:
> On Wed, Feb 12, 2014 at 2:50 PM, Martin Dobias <wonder.sk at gmail.com> wrote:
>> Hi Radim
>>
>> On Wed, Feb 12, 2014 at 8:03 PM, Radim Blazek <radim.blazek at gmail.com> wrote:
>>> On Wed, Feb 12, 2014 at 1:45 PM, Radim Blazek <radim.blazek at gmail.com> wrote:
>>>> I am using rubber band in Python plugin:
>>>>    self.rb = QgsRubberBand(self.canvas,  QGis.Polygon)
>>>> and on mouse move
>>>>    self.rb.addPoint( point, update )
>>>>
>>>> It works well on most systems only for Win7/32bit (QGIS 2.0.1, Python
>>>> 2.7.4) it was reported that it fails with "RuntimeError: underlying
>>>> C/C++ object has been deleted"
>> When does it report the error - when closing QGIS?
> I don't know but I presume when map tool is used, it is called from
> QgsMapTool::canvasMoveEvent().
>
> Radim
>
>>>> I see that ownership of rubber band is passed to map canvas
>>>>
>>>>     QgsRubberBand( QgsMapCanvas* mapCanvas /TransferThis/,
>>>> QGis::GeometryType geometryType = QGis::Line );
>>>>
>>>> that is OK, but QgsMapCanvas should not delete QGraphicsItem until it
>>>> is destructed.
>>>>
>>>> So how can the QgsRubberBand be deleted before QGIS is closed?
>>> BTW, because true owner of QGraphicsItem is QGraphicsScene, should not
>>> we first mScene->removeItem() (which returns ownership) before item is
>>> deleted in QgsMapCanvas destructor?
>> That's the correct approach in Python (IIRC). You can remove the item
>> in your map tool's deactivate() method.
>>
>> Regards
>> Martin
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer



More information about the Qgis-developer mailing list