1

在处理 QGraphicsScene 和 QPixmap 时,我遇到了一个问题。我正在按顺序显示由相机捕获的帧。QTimer 对象每 100 毫秒调用一次 updateSingleView() 函数。那是我的内在功能:

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,但显然不是。你知道为什么会发生泄漏以及如何解决它吗?

4

2 回答 2

2

来自 Qt 文档:

无效 QGraphicsScene::removeItem ( QGraphicsItem * item )

从场景中移除项目项及其所有子项。项目的所有权被传递给调用者(即,QGraphicsScene 在销毁时将不再删除项目)。

另请参见 addItem()。

因此,您需要delete手动删除该项目。

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

于 2010-11-24T09:26:21.050 回答
1

正如建议的那样

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

IE

QPointer _item = scene.at(0)->items().at(0); 场景.at(0)->removeItem(_item); 删除_项目;

场景.at(0)->addPixmap(QPixmap::fromImage(Img));

......

于 2010-11-24T16:35:13.927 回答