2017-09-24 6 views
0

PyQt4を使用して進化シミュレータアプリケーションを作成しています。 QGraphicsのシーンには「生き物」と「植生」があります。生き物は食べたときに収縮する植物を食べ、一定の大きさになると死んで現場から削除されます。飢えた生物も死ぬと削除されます。QGraphicsItemをシーンから削除する際のセグメンテーションエラー

問題は、シーンから植生アイテムを削除すると、セグメント違反が発生することです(直ちにではなく、時間がかかります)。これは生態系と同じ概念ではありますが、生態系を追加したときにのみ、生態系には発生しませんでした。私はアイテムを削除

特定のループは次のように(コードがコメントに置き換えコードのかなりの量と簡略化される)である。

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を実行しています。

+0

アイテムの反復処理中にアイテムを削除するのは良い考えのようではありません。またはインデントが間違っていますか? – ekhumoro

+0

私はあなたが話していることを見ます。私はそれを移動しようとしましたので、 'items for items'ループの外ですが、プログラムはまだクラッシュします。 –

+0

私はあなたの投稿されたコードのインデントが間違っていると思います。 – strubbly

答えて

0

私に似た問題を抱えている人にとって、私は修正を見つけました。植生や生き物の輪郭と結びつけることです。彼らのQRectF()が変更されているとき、シーンは変更前に以前のboundingRect()を使用します。

item.prepareGeometryChange() 

または

item1.prepareGeometryChange() 

されていた生物に依存:修正はそうするためのコードだった、彼らが変更されたときに、各項目の新しいQRectFを()を更新する場面を調製することにより行われていましたかわった。このコード行は、QRectF()が変更される直前に追加されました。

バウンディングレクトについては、@strubblyにありがとうございます。

関連する問題