【问题标题】:Removing Qpixmap from QGraphicsScene从 QGraphicsScene 中移除 Qpixmap
【发布时间】:2010-11-24 09:09:37
【问题描述】:

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

【问题讨论】:

  • 什么版本的 Qt?我在 4.6 上遇到了一些问题。?在 Windows 上。

标签: c++ qt qgraphicsview


【解决方案1】:

来自 Qt 文档:

void QGraphicsScene::removeItem ( QGraphicsItem * item )

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

另见 addItem()。

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

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

【讨论】:

  • 你能更精确一点吗?我无法使用“删除”删除项目,因为它不是用“新”创建的(对于像素图也是如此)。
  • addPixamp() 和 QGraphicsScene 上的类似帮助程序是简单的包装器,它们为您创建(通过新的)QGraphicsItem - 在本例中为 QGraphicsPixmapItem。因此,在项目从场景中移除后,您确实需要删除它。
  • 此外,使用 SnapShot() 方法(未定义所有权)返回一个 char 数组可能会导致混淆 - QByteArray 非常适合此操作,不需要 delete [],也没有可能的所有权错误。
【解决方案2】:

按照建议

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

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

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

.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多