pyqt和弱/强参考:如何进行

时间:2014-11-23 17:53:31

标签: python pyqt pyqt4

[编辑] 我似乎解决了这个问题......事实上,我现在这样做了:

class Gameboard(QGraphicsScene):
    def deletePawn(self, num):
        pawnToDelete = self.pawns.pop(num)  
        pawnToDelete.delete()

class Pawn(QGraphicsItem):  
    def delete(self):
        child.prepareGemotryChange()
        child.setParent(None)
        #idem for each child
        self.gameboard.removeItem(self)
        self.gameboard = None

[/编辑]

在pyqt QGraphicsScene中实现引用的好方法是什么?

我创建了一个继承QGraphicsScene的Gameboard类,这个游戏板包含可变数量的棋子(它继承了QGraphicsPolygonItem)

可以动态创建或删除典当,创建即可,但删除有时会崩溃......

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtOpenGL

class Gameboard(QGraphicsScene):
   def __init__(self):
      super(Gameboard, self).__init__()
      self.pawns = {}
      self.currentPawn = None

   def createSquares(self):
      #create the polygons of the squares and affect their coordinates x,y

   def createPawn(self):
      pawn = Pawn(self)
      num = len(self.pawns)
      self.pawns[num] = pawn
      self.addItem(self.pawns[num]) 

   def deletePawn(self, num):
      self.currentPawn = None
      self.pawns[num].beforeDelete()
      self.pawns[num].prepareGeometryChange()  
      self.removeItem(self.pawns[num])
      del self.pawns[num] 

   def selectPawn(self, pawn):
      #a pawn is selected, by click for example
      self.currentPawn = pawn

   def keyPressEvent(self, event):
      ekey = event.key()
      if ekey == Qt.Key_Delete and self.currentPawn != None:
          num = self.currentPawn.number
          self.deletePawn(num) 


class Pawn(QGraphicsItem):
   def __init__(self, gameboard):
      super(Pawn, self).__init__()
      self.gameboard = gameboard  
      self.number = 0
      self.pos = (-1,-1)  
      self.name = ""

   def create(self, x, y, num):
      #create a QGraphicsPolygonItem, a QGraphixPixmapItem and a QGraphicsTextItem which are child of the QGraphicsItem Pawn, and set position
      self.number = num 
      self.pos = (x,y)
      self.gameboard.squares[(x,y)].occupiedBy = self 

   def move(self, newPos):
      self.gameboard.squares[self.pos].occupiedBy = None
      self.pos = newPos
      self.gameboard.squares[self.pos].occupiedBy = None

   def beforeDelete(self):
      #a function I add trying to get rid of the crash
      self.gameboard = None
      self.graphicsPolygon.setParent = None
      self.graphicsPix.setParent = None
      self.text.setParent = None 

   def mousePressEvent(self, event):
    super(Pawn, self).mousePressEvent(event)
    if event.button() == 1:
       self.gameboard.currentPawn = self  
       event.accept()

class Square(QGraphicsPolygonItem):
   def __init__(self, gameboard):
      self.coordinates = (x,y)
      self.occupiedBy = None

如果使用deleteLater,有什么方法可以继续? 或者可能是weakref lib的东西? 是因为Pawn中的变量gameboard吗?

0 个答案:

没有答案