从场景中删除qgraphictem时的分割故障



我正在使用PYQT4编写一个Evolution Simulator应用程序。我在Qgraphics场景中有"生物"one_answers"植被"。这些生物会吃掉植被,随着食物而萎缩,当它降低到一定尺寸时,它会死亡并从现场删除。饥饿的生物在死亡时也会被删除。

问题是,当我从场景中删除植被项目时,我会得到一个分割的故障(不是立即,需要不同的时间)。只有当我添加植被时,这些生物就不会发生这种情况,尽管它们在概念上与生物相同(班级实例)。

我删除项目的特定循环如下(简化了代码,用大量的代码替换为注释):

    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。

因此,对于与我有类似问题的任何人,我找到了一个修复程序。这与植被和生物的边界有关。当更改其qRectf()时,场景仍在更改之前使用上一个boundingRect()。修复程序是通过准备场景来更新每个项目的新QRETCTF()时完成的修复程序,当它们更改时,执行的代码是:

item.prepareGeometryChange()

item1.prepareGeometryChange()

取决于改变了哪种生物。在更改其qRectf()之前,添加了这一行的代码。

谢谢@strubly提及项目的边界。

相关内容

  • 没有找到相关文章

最新更新