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