从 QGraphicsScene 中删除 Qpixmap

发布于 2024-10-04 16:12:31 字数 679 浏览 5 评论 0原文

在处理 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,但显然事实并非如此。您知道为什么会出现泄漏以及如何解决吗?

I enconutered a problem, when dealing with QGraphicsScene and QPixmap.
I am sequentially displaying frames, captured by the camera. QTimer object is calling updateSingleView() function every 100ms. That is my inner function:

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 is displaying the camera's view but unfortunatelly there is a memory leak, when calling scenes.at(0)->addPixmap(QPixmap::fromImage(Img)); I thought that removeItem function should destroy the old QPixmap, but apparently its not. Do you know why the leak occurs and how to solve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橘味果▽酱 2024-10-11 16:12:31

来自 Qt 文档:

void QGraphicsScene::removeItem ( QGraphicsItem * item )

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

另请参见 addItem()。

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

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

From the Qt documentation:

void QGraphicsScene::removeItem ( QGraphicsItem * item )

Removes the item item and all its children from the scene. The ownership of item is passed on to the caller (i.e., QGraphicsScene will no longer delete item when destroyed).

See also addItem().

Hence you need to delete the item using delete manually.

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

貪欢 2024-10-11 16:12:31

根据建议,

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

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

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

……

As suggested

you need to delete the item after removeItem line.

i.e

QPointer _item = scenes.at(0)->items().at(0);
scenes.at(0)->removeItem( _item );
delete _item;

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

.....

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文