У меня проблема с 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
использует закрытый метод QImageIplImageCvt
для создания QImage
из IplImage
(который используется OpenCV), который затем используется для создания QPixmap
, чтобы показать изображение в полноэкранный. FullScreenImage
класс наследует QLabel
.
После некоторой задержки полноэкранное изображение должно быть скрыто, поэтому я использую QTimer
, чтобы вызвать событие после некоторой задержки. Обработчик событий - это метод hideOnScreen
, который скрывает метку и должен очистить память.
Проблема заключается в следующем:
Всякий раз, когда я вызываю QPixmap::fromImage
, он выделяет память для данных растрового изображения и копирует данные из буфера памяти QImage
в буфер памяти QPixmap
. После того как метка скрыта, данные QPixmap
по-прежнему остаются выделенными, и, что еще хуже, после нового вызова QPixmap::fromImage
новый фрагмент памяти выделяется для нового изображения, а старые данные не освобождаются из памяти. Это вызывает утечку памяти (около 10 МБ на вызов метода с моими тестовыми изображениями). Как я могу решить эту утечку?
Я даже пытался создать личную переменную QPixmap
, сохранить для нее растровое изображение, созданное QPixmap::fromImage
, а затем попытался вызвать его деструктор в методе hideOnScreen
, но это не помогло.
Существует ли нестатический способ создания QPixmap
из QImage
? Или еще лучше, есть ли способ создать QPixmap
прямо из IplImage*
?
Заранее благодарю за ответы.