qt - 如何解决 QPixmap::fromImage 内存泄漏?

标签 qt memory-leaks opencv qimage qpixmap

我对 Qt 有疑问。

这是让我感到困扰的部分代码:

    void FullScreenImage::QImageIplImageCvt(IplImage *input)
{
    help=cvCreateImage(cvGetSize(input), input->depth, input->nChannels);
    cvCvtColor(input, help, CV_BGR2RGB);
    QImage tmp((uchar *)help->imageData, help->width, help->height, help->widthStep, QImage::Format_RGB888);
    this->setPixmap(QPixmap::fromImage(tmp).scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
    cvReleaseImage(&help);
}


void FullScreenImage::hideOnScreen() {
    this->hide();
    this->clear();
}

void FullScreenImage::showOnScreen(IplImage *slika, int delay) {
    QImageIplImageCvt(slika);
    this->showFullScreen();
    if(delay>0)
 QTimer::singleShot(delay*1000, this, SLOT(hideOnScreen()));
}

因此,showOnScreen 方法使用私有(private)方法 QImageIplImageCvtIplImage 创建 QImage(由OpenCV),然后用于创建 QPixmap 以全屏显示图像。 FullScreenImage类继承QLabel

经过一些延迟后,全屏图片应该被隐藏,所以我使用 QTimer 来在一些延迟后触发一个事件。事件处理程序是隐藏标签并清除内存的 hideOnScreen 方法。

问题如下:

每当我调用QPixmap::fromImage时,它都会为像素图数据分配内存并将数据从QImage内存缓冲区复制到QPixmap 内存缓冲区。隐藏标签后,QPixmap 数据仍然保持分配状态,更糟糕的是,在新的 QPixmap::fromImage 调用之后,新的内存块被分配给新图片,并且旧数据不会从内存中释放。这会导致内存泄漏(我的测试图片每次方法调用大约 10 MB)。我该如何解决该泄漏问题?

我什至尝试创建一个私有(private)的QPixmap 变量,将QPixmap::fromImage 创建的像素图存储到它,然后尝试在hideOnScreen 方法,但没有帮助。

有没有一种非静态的方法可以从 QImage 创建 QPixmap?或者更好的是,有没有办法直接从 IplImage* 创建 QPixmap

预先感谢您的回答。

最佳答案

无法直接从 IplImage*(也不能从 cv::Mat)创建 QPixmap。但是,您的解决方案是避免将所有内容都写到一行中,而是使用您释放自己的指针。

例如:

if (this->mypixmap)
    delete this->mypixmap;
this->mypixmap = new QPixmap(QPixmap::fromImage(tmp).scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
this->setPixmap(this->mypixmap);

不要忘记在构造函数中设置mypixmap(NULL)

关于qt - 如何解决 QPixmap::fromImage 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750209/

相关文章:

c++ - 如何调整 QMessageBox 的大小?

QT将字符串转换为UTF-8

java - 为什么有些网络服务器会提示他们造成的内存泄漏?

python - 使激光探测器在我的代码中有错误

linux - 在 ubuntu 上升级 qt 版本以使用 QopenGLWidget

javascript - 仅调用 deleteLater() 是否足以避免使用 Embind 的 Javascript 中的内存泄漏?

Javascript 内存泄漏 : why would assigning object to null work?

eclipse - Eclipse-Cygwin 中的多个目标模式错误

c++ - 用自己的 ROI (opencv) 正确替换 cv::Mat

c++ - 如何防止在加载程序中重新创建页面?