Removendo qpixmap da QGraphicsScene
-
27-09-2019 - |
Pergunta
Encanguei um problema, ao lidar com QGraphicsScene e Qpixmap. Estou exibindo sequencialmente quadros, capturados pela câmera. O objeto Qtimer está chamando a função UpdateLingView () a cada 100ms. Essa é minha função interna:
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;
}
A GUI está exibindo a visão da câmera, mas infelizmente há um vazamento de memória, ao ligar scenes.at(0)->addPixmap(QPixmap::fromImage(Img));
Eu pensei que removeItem
A função deve destruir o antigo qpixmap, mas aparentemente não é. Você sabe por que o vazamento ocorre e como resolvê -lo?
Solução
Como sugerido
Você precisa excluir o item após a linha Remofitem.
ou seja
Qpointer _item = cenas.at (0)-> itens (). Em (0); cenas.at (0)-> removetem (_item); apagar item;
cenas.at (0)-> addPixMap (qpixmap :: FromImage (IMG));
.....
Outras dicas
Da documentação do QT:
Void QGraphicsScene :: RemoneItem (qgraphicsItem * item)
Remove o item e todos os seus filhos da cena. A propriedade do item é repassada ao chamador (ou seja, QGraphicsScene não excluirá mais o item quando destruído).
Veja também addItem ().
Portanto, você precisa excluir o item usando delete
manualmente.