[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