我对 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)方法 QImageIplImageCvt
从 IplImage
创建 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/