天天看點

移動,删除QGraphicItems的時候,QGraphicsSceneFindItemBspTreeVisitor::visit相關的bug解決

最近調程式,發現個qgraphicsceen相關的bug,覺得有必要記錄一下

程式crash的時候,提示的内容與QGraphicsSceneFindItemBspTreeVisitor::visit相關。

查了一下相關資料,發現QGraphicsScene内部有個BspTree,用來友善索引sceen内部的item,但使用QGraphicsScene::removeItem之後,delete item的時候(如果隻是removeitem的話,記憶體不會被釋放,不停地增加删除item的時候會導緻記憶體洩露,是以在removeitem之後要delete item),這個索引tree内部沒有做好保護,導緻索引item的時候指向不存在的item,進而crash,解決方法是:

在建立QGraphicsScene的執行個體的時候,加一句

QGraphicsScene::`setItemIndexMethod(QGraphicsScene::ItemIndexMethod::NoIndex);`
           

相關參數解釋如下:

-QGraphicsScene :: BspTreeIndex:應用了二進制空間分區樹。 通過使用二進制搜尋,所有QGraphicsScene的項目定位算法的數量級都接近對數複雜度。 添加,移動和删除項目是對數的。 此方法最适合靜态場景(即大多數項目不移動的場景)。

-QGraphicsScene :: NoIndex:不應用索引。 物品的位置具有線性複雜性,因為會搜尋場景中的所有物品。 但是,添加,移動和删除項目是在固定時間内完成的。 這種方法是動态場景的理想選擇,在動态場景中,連續添加,移動或删除許多項目。

繼續閱讀