Удаление Qpixmap из QGraphicsScene

Я столкнулся с проблемой при работе с QGraphicsScene и QPixmap. Последовательно вывожу кадры, снятые камерой. Объект QTimer вызывает функцию updateSingleView() каждые 100 мс. Это моя внутренняя функция:

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;
}

Графический интерфейс отображает вид с камеры, но, к сожалению, есть утечка памяти, при вызове scenes.at(0)->addPixmap(QPixmap::fromImage(Img)); я думал, что функция removeItem должна уничтожить старый QPixmap, но, видимо, это не так. Знаете ли вы, почему происходит утечка и как ее решить?


person Marcin    schedule 24.11.2010    source источник
comment
Какая версия Qt? У меня были проблемы с 4.6.? в Windows.   -  person sje397    schedule 24.11.2010


Ответы (2)


Как было предложено

вам нужно удалить элемент после строки removeItem.

i.e

QPointer _item = scenes.at(0)->items().at(0); scenes.at(0)->removeItem(_item); удалить пункт;

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

.....

person Huzy    schedule 24.11.2010

Из документации Qt:

void QGraphicsScene::removeItem ( QGraphicsItem * item )

Удаляет элемент item и всех его дочерних элементов со сцены. Право собственности на элемент передается вызывающей стороне (т. е. QGraphicsScene больше не будет удалять элемент при уничтожении).

См. также addItem().

Следовательно, вам нужно удалить элемент, используя delete вручную.

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

person BastiBen    schedule 24.11.2010
comment
Не могли бы вы быть более точным? Я не могу удалить элемент с помощью «удалить», так как он не был создан с помощью «нового» (то же самое для растрового изображения). - person Marcin; 24.11.2010
comment
addPixamp() и аналогичные помощники в QGraphicsScene — это простые оболочки, которые создают (через new) для вас QGraphicsItem — в данном случае QGraphicsPixmapItem. Следовательно, вам нужно удалить это после того, как элемент будет удален со сцены. - person James Turner; 26.11.2010
comment
Кроме того, возврат массива символов с помощью вашего метода SnapShot() (который не определяет право собственности) может вызвать путаницу - QByteArray идеально подходит для этого, не требуется удаление [] и нет возможных ошибок владения. - person James Turner; 26.11.2010