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 QPixmaps deWinHBITMAPto create aQPixmapwhich I can then pass to theQLabelsFonction 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");
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top