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@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to