Удаление HBitmap, помещенного в QLabel
У меня есть серия QLabel
объекты в моем Qt GUI, и я заполняю их объектами HBITMAP. Эти HBITMAP являются буферами в памяти, они не существуют на диске.
Теперь я использую QPixmap
s fromWinHBITMAP
to create a
QPixmapwhich I can then pass to the
QLabels
Функция setPixmap`.
Теперь возникает вопрос: что происходит с текущим изображением в QLabel, когда я перезаписываю его другим, оно остается в памяти? Это удаляется?
Я подозреваю, что он не удаляется должным образом, так как моя программа увеличивается до огромных размеров после работы в течение часа. (1.7GB) в памяти.
Код, который выполняет преобразование:
//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 ответ
QPixmap::fromWinHBITMAP
сделать копию данного растрового изображения, а не псевдонима.
Вы должны удалить исходное растровое изображение сразу после преобразования в QPixmap
потому что зов oWinHBITMAP
делает копию (снова) растрового изображения, хранящегося в заданном растровом изображении, но не дает вам возможность обращаться к исходному растровому изображению Windows.