[Interest] QGraphicsScene & removing item

Igor Mironchik igor.mironchik at gmail.com
Sat Jun 25 18:40:10 CEST 2016


Hi,

I ran into a problem. When I delete item (QGraphicsItem) from scene I 
received following crash:

1   QGraphicsSceneFindItemBspTreeVisitor::visit 
qgraphicsscene_bsp.cpp         77   0x7ffff76aeb24
2   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         245  
0x7ffff76ae6dc
3   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         259  
0x7ffff76ae7ba
4   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         250  
0x7ffff76ae71b
5   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         259  
0x7ffff76ae7ba
6   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         250  
0x7ffff76ae71b
7   QGraphicsSceneBspTree::climbTree qgraphicsscene_bsp.cpp         259  
0x7ffff76ae7ba
8   QGraphicsSceneBspTree::items qgraphicsscene_bsp.cpp         152  
0x7ffff76adb8a
9   QGraphicsSceneBspTreeIndexPrivate::estimateItems 
qgraphicsscenebsptreeindex.cpp 389  0x7ffff76b1c14
10  QGraphicsSceneBspTreeIndex::estimateTopLevelItems 
qgraphicsscenebsptreeindex.cpp 543  0x7ffff76b24d5
11  QGraphicsScenePrivate::drawItems qgraphicsscene.cpp             4712 
0x7ffff76937b9
12  QGraphicsView::paintEvent qgraphicsview.cpp              3550 
0x7ffff76cc13a
13  QWidget::event qwidget.cpp                    8930 0x7ffff72b0d9e
14  QFrame::event qframe.cpp                     550  0x7ffff73ff4a5
15  QAbstractScrollArea::viewportEvent qabstractscrollarea.cpp        
1213 0x7ffff74b92e0
16  QGraphicsView::viewportEvent qgraphicsview.cpp              2973 
0x7ffff76c9930
17  QAbstractScrollAreaPrivate::viewportEvent 
qabstractscrollarea_p.h        111  0x7ffff74ba6d3
18  QAbstractScrollAreaFilter::eventFilter 
qabstractscrollarea_p.h        127  0x7ffff74ba7be
19  QCoreApplicationPrivate::sendThroughObjectEventFilters 
qcoreapplication.cpp           1099 0x7ffff65a222f
20  QApplicationPrivate::notify_helper qapplication.cpp               
3795 0x7ffff725a201
... <More>

Where visit() is:

void visit(QList<QGraphicsItem *> *items) Q_DECL_OVERRIDE
     {
         for (int i = 0; i < items->size(); ++i) {
             QGraphicsItem *item = items->at(i);
             if (onlyTopLevelItems && item->d_ptr->parent)
                 item = item->topLevelItem();
             if (!item->d_func()->itemDiscovered && item->d_ptr->visible) {
                 item->d_func()->itemDiscovered = 1;
                 foundItems->prepend(item);
             }
         }
     }

I did two deletions and in this method I received two broken QGraphicsItems:


     Locals
         i    1    int
         item    @0x706990    QGraphicsItem
             [vptr]    <not accessible>
                 [0]
             d_ptr    12884901888 QScopedPointer<QGraphicsItemPrivate, 
QScopedPointerDeleter<QGraphicsItemPrivate> >
         items    <4 items>    QList<QGraphicsItem*>
             [0]    @0x866070    Prototyper::Core::GridSnap
             [1]    @0x706990    QGraphicsItem
                 [vptr]    0x0
                 d_ptr    12884901888 
QScopedPointer<QGraphicsItemPrivate, 
QScopedPointerDeleter<QGraphicsItemPrivate> >
             [2]    @0x706990    QGraphicsItem
                 [vptr]    0x0
                 d_ptr    12884901888 
QScopedPointer<QGraphicsItemPrivate, 
QScopedPointerDeleter<QGraphicsItemPrivate> >
             [3]    @0x866110    Prototyper::Core::Form
         this    @0x865f40    QGraphicsSceneFindItemBspTreeVisitor
     Inspector
     Expressions
     Return Value
     Tooltip
         FormAction    <not accessible>
         FormResizeHandle    <not accessible>
         Q_DECL_OVERRIDE    <no such value>
         WithResizeAndMoveHandles    <not accessible>
         foundItems    <1 items>    QList<QGraphicsItem*>
         m_bottom    <not accessible>
         onlyTopLevelItems    true    bool
         setDeltaToZero    <not accessible>

My delete method is:

void
Form::deleteItems( const QList< QGraphicsItem* > & items )
{
     foreach( QGraphicsItem * item, items )
     {
         if( item == d->m_current )
             d->m_current = 0;

         FormObject * obj = dynamic_cast< FormObject* > ( item );

         if( obj )
         {
             pushUndoDeleteCommand( d->m_undoStack, obj, this );

             d->m_model->removeObject( obj, this );

             d->removeDescriptions( obj );
         }

         scene()->removeItem( item );

         if( obj )
         {
             d->m_model->endRemoveObject();

             d->m_ids.removeOne( obj->objectId() );

             switch( obj->objectType() )
             {
                 case FormObject::GroupType :
                 {
                     FormGroup * group = dynamic_cast< FormGroup* > ( 
item );

                     if( group )
                     {
                         d->clearIds( group );

                         group->postDeletion();
                     }
                 }
                     break;

                 default :
                 {
                     obj->postDeletion();
                 }
                     break;
             }
         }

         delete item;
     }
}

I do scene()->removeItem( item ); and delete item; but in the internals 
of QGraphicsScene I got two damaged pointers...

What is the problem? Thank you.

P.S. postDeletion() methods now is empty, like:

void postDeletion()
{
}




More information about the Interest mailing list