Удаление HBitmap, помещенного в QLabel - PullRequest
1 голос
/ 24 февраля 2012

У меня есть серия QLabel объектов в моем Qt GUI, и я заполняю их объектами HBITMAP. Эти HBITMAP являются буферами в памяти, они не существуют на диске.

Теперь я использую функцию QPixmap s fromWinHBITMAP to create a QPixmap which I can then pass to the QLabel s setPixmap`.

Теперь возникает вопрос: что происходит с текущим изображением в QLabel, когда я перезаписываю его другим, оно остается в памяти? Это удаляется?

Я подозреваю, что он не удаляется должным образом, так как моя программа увеличивается до огромных размеров после работы в течение часа. (1,7 ГБ) в памяти.

Код, который выполняет преобразование:

//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");
}

1 Ответ

2 голосов
/ 24 февраля 2012

QPixmap::fromWinHBITMAP сделать копию данного растрового изображения, а не псевдонима.

Вы должны удалить исходное растровое изображение сразу после преобразования в QPixmap, потому что вызов oWinHBITMAP делает копию ( снова) растрового изображения, хранящегося в заданном растровом изображении, но не позволяющего вам обращаться к исходному растровому изображению Windows.

...