从场景中删除QGraphicsItem时出现分段错误

时间:2017-09-24 21:40:14

标签: python-3.x segmentation-fault pyqt4

我正在使用PyQt4编写进化模拟器应用程序。我有'生物'和'植被'在QGraphics场景中。这些生物会吃掉植物,它会在吃掉时收缩,当它落到一定的大小时,就会死掉并从场景中删除。饥饿的生物在死亡时也会被删除。

问题是,当我从场景中删除植被项目时,我得到了一个分段错误(不是立即,它需要不同的时间)。虽然它们在概念上与生物(类实例)相同,但这些生物并没有发生这种情况。

我删除项目的具体循环如下(代码被简化,大量代码被注释替换):

    dead = set()
    items = self.scene.items()
    for item in items:
        if isinstance(item, Creature):
            # Do some calculation to specify what creature does
            for item1 in self.scene.items():
                # Look through other items on scene and define interactions
                if isinstance(item1, Creature):
                    # Specify what to do if current item is being compared to another creature
                if isinstance(item1, Vegetation):
                    # Specify what to do if current item is being compared to vegetation
                # If creature dies, add to dead set
                dead.add(item)

        elif isinstance(item, Vegetation):
            # Do same as for creature (see above)
        # If vegetation dies, add to dead set
        dead.add(item)

    # Get rid of all dead items from scene
    while dead:
        deadItem = dead.pop()
        self.scene.removeItem(deadItem)
        del deadItem

如果我注释掉self.scene.removeItem行,那么程序不会崩溃。

似乎程序正在调用一个不再有效的内存地址,但我不知道是什么导致它。

整个应用程序很长,这就是为什么我没有把它放在这里,但如果有必要我可以添加它。

我在Windows上使用PyQt4运行Python 3.4.3。

1 个答案:

答案 0 :(得分:0)

所以对于遇到类似问题的人,我找到了解决办法。它与植被和生物的边界关系有关。当他们的QRectF()被更改时,场景仍然在更改之前使用先前的boundingRect()。修复是通过准备场景来更新每个项目的新QRectF(),这样做的代码是:

item.prepareGeometryChange()

item1.prepareGeometryChange()

取决于哪个生物体已经改变。这行代码是在更改QRectF()之前添加的。

感谢@strubbly提及项目的boundingRect。