删除放置在QLabel中的HBitmap



我的Qt GUI上有一系列QLabel对象,我用HBITMAP对象填充它们。这些HBITMAP是内存中的缓冲区,它们不存在于磁盘上。

现在我使用WinHBITMAP which I can then pass to the QPixmap s QLabel QPixmap::fromWinHBITMAP setPixmap`函数中的QPixmap s

现在,问题是,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");
}

QPixmap复制给定位图,而不是别名位图。

您应该在转换为oWinHBITMAP后立即删除原始位图,因为对CCD_9的调用会复制位图(再次),存储在给定的像素图中,但不会为您提供原始窗口位图的句柄。

相关内容

  • 没有找到相关文章

最新更新