[Interest] QGraphicsScene & removing item

Jean-Michaël Celerier jeanmichael.celerier at gmail.com
Sun Jun 26 09:55:28 CEST 2016


> qgraphicsscene_bsp

Maybe you can try to change the indexing mode. I remember having
unexplainable crashes with the BSP tree in early 5.x versions...
See : http://doc.qt.io/qt-5/qgraphicsscene.html#itemIndexMethod-prop

Best
Jean-Michaël

On Sat, Jun 25, 2016 at 9:04 PM, Igor Mironchik <igor.mironchik at gmail.com>
wrote:

> Hi.
>
> Removing of scene()->removeItem( item ); solved the problem.
>
> I read old mailing list about such problem, yet in Qt 4. And guys advised
> to put prepareGeometryChange(). I checked it, and with this method app
> crashes more frequently.
>
> And removing removeItem() solves the problem.
>
> So problem is very old. May be somebody know what is the reason?
>
>
> On 25.06.2016 19:40, Igor Mironchik wrote:
>
>> 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()
>> {
>> }
>>
>>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160626/cef363c6/attachment.html>


More information about the Interest mailing list