2012-10-24 51 views
2

我有一個QGraphicsScene,我添加了一個名爲BorderRect的子類QGraphicsRectItem,它指出了sceneRect的邊界。 BorderRect具有允許用戶改變其大小的夾點,然後改變場景的sceneRect。這一切工作,但每一次在一段時間它會導致賽格故障狀態,用回溯:QGraphicsScene :: setSceneRect()分段錯誤

#0 _int_malloc (av=0x7ffff587e620, bytes=32) at malloc.c:3415 
#1 0x00007ffff55592a4 in *__GI___libc_malloc (bytes=32) at malloc.c:2924 
#2 0x00007ffff5e4c40d in operator new(unsigned long)() from /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6 
#3 0x00007ffff723911e in QRegion::QRegion(QRect const&, QRegion::RegionType)() from /usr/lib64/qt4/libQtGui.so.4 
#4 0x00007ffff72394de in QRegion::intersect(QRect const&) const() from /usr/lib64/qt4/libQtGui.so.4 
#5 0x00007ffff7239509 in QRegion::operator&(QRect const&) const() from /usr/lib64/qt4/libQtGui.so.4 
#6 0x00007ffff723952f in QRegion::operator&=(QRect const&)() from /usr/lib64/qt4/libQtGui.so.4 
#7 0x00007ffff70e0c6b in QWidgetPrivate::subtractOpaqueSiblings(QRegion&, bool*, bool) const() 
    from /usr/lib64/qt4/libQtGui.so.4 
#8 0x00007ffff72b6141 in QWidgetPrivate::scrollRect(QRect const&, int, int)() from /usr/lib64/qt4/libQtGui.so.4 
#9 0x00007ffff712fe8a in QWidgetPrivate::scroll_sys(int, int)() from /usr/lib64/qt4/libQtGui.so.4 
#10 0x00007ffff70eefe5 in QWidget::scroll(int, int)() from /usr/lib64/qt4/libQtGui.so.4 
#11 0x00007ffff76b7fbb in QGraphicsView::scrollContentsBy(int, int)() from /usr/lib64/qt4/libQtGui.so.4 
#12 0x00007ffff6b7c0fa in QMetaObject::activate(QObject*, QMetaObject const*, int, void**)() 
    from /usr/lib64/qt4/libQtCore.so.4 
#13 0x00007ffff770ec7e in QAbstractSlider::valueChanged(int)() from /usr/lib64/qt4/libQtGui.so.4 
#14 0x00007ffff76b0dca in QGraphicsViewPrivate::recalculateContentSize()() from /usr/lib64/qt4/libQtGui.so.4 
#15 0x00007ffff76bab39 in ??() from /usr/lib64/qt4/libQtGui.so.4 
#16 0x00007ffff6b7c0fa in QMetaObject::activate(QObject*, QMetaObject const*, int, void**)() 
    from /usr/lib64/qt4/libQtCore.so.4 
#17 0x00007ffff7687a45 in QGraphicsScene::sceneRectChanged(QRectF const&)() from /usr/lib64/qt4/libQtGui.so.4 
#18 0x000000000042fef0 in BorderRectItem::sceneEventFilter (this=0xfc0070, watched=0xef6e80, event=0x7fffff800590) 
    at gui/BorderRectItem.cpp:193 
... 

有幾個行,但在後面跟蹤的線18條線對應的呼叫與對應於BorderRect的新尺寸的QRectF到setSceneRect,在這種情況下:

{xp = 20, yp = -59, w = 563.94193411401511, h = 436.5631806793956} 

我不知道這是爲什麼崩潰。我檢查過這個場景,它不是空的。我懷疑這將會非常難以調試,而我真正感興趣的是如何去做這件事的提示。特別是,當我在後面的軌跡中上下移動時,檢查Qt代碼中變量的狀態會非常有幫助,我不知道該怎麼做。我正在運行Linux ...我可以使用調試符號或其他東西來重建Qt嗎?

回答

1

只是猜測這裏,但堆棧跟蹤使我懷疑,你返回從一些自己的方法參考本地堆棧查閱QRect,或參考其他一些堆棧變量(甚至明確指向堆棧變量,但事故難度較大)。

是的,你可以編譯的Qt與調試符號,請參閱:

+0

本來我打過電話與BorderRect的矩形()函數setSceneRect,並得到了相同錯誤。我改變了一些東西,使它更容易調試(這樣我可以更容易地檢查我實際使用的QRectF的值來調用setSceneRect)。我最終等到鼠標被釋放以調用setSceneRect,現在它似乎沒有崩潰(它可能會崩潰的頻率較低,時間會告訴我們)。 – rainbowgoblin