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?

Foi útil?

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.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top