Suppression d'un HBitmap placé dans un QLabel
Question
J'ai une série de QLabel
objets sur mon interface graphique Qt, et je les remplis avec des objets HBITMAP.Ces HBITMAP sont des tampons en mémoire, ils n'existent pas sur le disque.
Maintenant, j'utilise le QPixmap
s deWinHBITMAP
to create a
QPixmapwhich I can then pass to the
QLabels
Fonction setPixmap`.
Maintenant, la question est : qu'arrive-t-il à l'image actuelle dans le QLabel, lorsque je l'écrase par une autre, reste-t-elle en mémoire ?Est-ce qu'il est supprimé ?
Je soupçonne qu'il n'est pas supprimé correctement, car mon programme prend des proportions énormes après environ une heure d'exécution.(1,7 Go) en mémoire.
Le code qui fait la conversion est :
//buffer is a map of QLabels which are filled with images.
void LoadPixmapFromBitmap(HBITMAP hBitmap, std::map<int, QLabel*>& buffer, int pixmapindex)
{
QPixmap pix;
pix = QPixmap::fromWinHBITMAP(hBitmap);
QPixmap temp(pix);
QSize sz(164, 121);
QPixmap resized(temp.scaled(sz));
QMatrix rotation;
rotation.rotate(90);
QPixmap rotated = resized.transformed(rotation);
//an attempt to delete the previous image properly and put in a new one. This doesn't seem to work.
if (buffer[pixmapindex]->pixmap() != NULL)
{
HBITMAP hbtmp = buffer[pixmapindex]->pixmap()->toWinHBITMAP();
buffer[pixmapindex]->clear();
HDC dc = GetDC(this->winId());
//HBITMAP p_old = SelectObject(dc, hbtmp);
BOOL deleted = DeleteObject(hbtmp);
if (!deleted)
PrintMsg("temp not deleted");
}
//////////////////////////////////end of attempt
buffer[pixmapindex]->setPixmap(rotated);
BOOL success = DeleteObject(hBitmap);
if (!success)
PrintMsg("hBitmap was not deleted");
}
La solution
QPixmap::fromWinHBITMAP
faire une copie du bitmap donné, pas un alias.
Vous devez supprimer le bitmap d'origine juste après la conversion en QPixmap
, parce que j'appelle à oWinHBITMAP
fait une copie (encore) de bitmap, stocké dans un pixmap donné, mais ne vous donne pas la possibilité de gérer le bitmap Windows d'origine.