2017-02-04 105 views
0

我使用的是PyQt 5.我有一个QGraphicsScene,它有一个QGraphicsObject的列表来显示。 我对QRectF和其他类型没有问题。不过,我实现了自定义类,如下所示:自定义QGraphicsItem删除自己

class RobotPathItem(QGraphicsItem): 
def __init__(self, path): 
    super().__init__() 
    qpath = [] 
    for xy in path: 
     qpath.append(QPoint(xy[0],xy[1])) 
    self.path = QPolygon(qpath) 

def paint(self, painter, option, qwidget = None): 
    painter.drawPoints(self.path) 

def boundingRect(self): 
    return QRectF(0,0,520,520) 

我把它添加到场景:

self.objects[model_obj.id].append(self.scene.addItem(RobotPathItem(model_obj.actuator.get_current_path()))) 

这里self.objects [model_obj.id]是相应的列表。 它确实在场景中显示。

问题是,在下一次迭代中,它是由于某种原因从列表中删除的。如果我检查

print(self.objects[model_obj.id][-1]) 

我得到“None”(NoneType)。所有其他对象仍在列表中。错误在哪里?

回答

1

原来addItem不返回类似addRect或其他函数的指针。 相反,它返回None。

所以上面的代码正常工作:的

robot_path = RobotPathItem(model_obj.actuator.get_current_path()) self.scene.addItem(robot_path) self.objects[model_obj.id].append(robot_path) 代替

self.objects[model_obj.id].append(RobotPathItem(model_obj.actuator.get_current_path())) 

,然后实现

self.objects[model_obj.id][2].set_path(model_obj.actuator.get_current_path()) 

更新它

+1

是的,这是正确的。由于addItem接受你添加的指针,所以不需要返回它,虽然在这种情况下,它会是一个很好的方便。 – goug