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

Reply via email to