2010-11-24 142 views
1

在处理QGraphicsScene和QPixmap时,我解决了一个问题。 我顺序显示由相机捕获的帧。 QTimer对象每100ms调用一次updateSingleView()函数。这是我的内部函数:从QGraphicsScene中删除Qpixmap

void CCIGui::updateSingleView() 
{ 

    unsigned char *const img = PGRSystem->SnapShot(); 

    QImage Img(img, 1024, 768, QImage::Format_RGB888); 

    scenes.at(0)->removeItem(scenes.at(0)->items().at(0)); 
    scenes.at(0)->addPixmap(QPixmap::fromImage(Img)); 

    ui_camViews.at(0).graphicsView->setScene(scenes.at(0)); 

    delete [] img; 
} 

的GUI显示相机的看法,但可惜的是有内存泄漏,呼吁scenes.at(0)->addPixmap(QPixmap::fromImage(Img));当我以为removeItem函数应该摧毁旧的QPixmap,但显然它不是。你知道为什么会发生泄漏以及如何解决它?

+0

什么版本的Qt?我在4.6中遇到了一些麻烦。?在Windows上。 – sje397 2010-11-24 09:12:10

+0

我正在使用Qt版本4.6.3。 – Marcin 2010-11-24 09:24:34

回答

1

至于建议

您需要删除的removeItem行之后的项目。

QPointer _item = scenes.at(0) - >项()在(0)。 scenes.at(0) - > removeItem(_item); 删除_item; (0) - > addPixmap(QPixmap :: fromImage(Img));} addPixmap(QPixmap :: fromImage(Img));

.....

2

从Qt文档:

无效QGraphicsScene ::的removeItem(*的QGraphicsItem项目)

删除项项目,并从现场的所有儿童。项目的所有权被传递给调用者(即,QGraphicsScene在销毁时不再删除项目)。

另请参阅addItem()。

因此,您需要手动删除使用delete的项目。

http://doc.trolltech.com/4.7/qgraphicsscene.html#removeItem