我对 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使用私有方法从(OpenCV 使用)QImageIplImageCvt创建,然后用于创建以全屏显示图像。类继承。QImageIplImageQPixmapFullScreenImageQLabel
经过一段时间的延迟,全屏图片应该被隐藏,所以我使用QTimer延迟一段时间后触发事件。事件处理程序是hideOnScreen隐藏标签并应清除内存的方法。
问题如下:
每当我调用QPixmap::fromImage时,它都会为像素图数据分配内存并将数据从QImage内存缓冲区复制到QPixmap内存缓冲区。隐藏标签后,QPixmap数据仍然保持分配状态,更糟糕的是,在新QPixmap::fromImage调用之后,为新图片分配了新的内存块,而旧数据并没有从内存中释放出来。这会导致内存泄漏(使用我的测试图片的每个方法调用大约 10 MB)。我该如何解决这个泄漏?
我什至尝试创建一个私有QPixmap变量,存储由QPixmap::fromImage它创建的像素图,然后尝试在hideOnScreen方法中调用它的析构函数,但它没有帮助。
有没有一种非静态的方式来QPixmap创建QImage?或者更好的是,有没有办法QPixmap直接从创建IplImage*?
预先感谢您的回答。