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を使用して(OpenCVで使用される)から作成し、画像を全画面で表示するために作成するために使用されQImageます。クラスはを継承します。IplImageQPixmapFullScreenImageQLabel
少し遅れるとフルスクリーン画像が非表示になるはずなので、QTimer少し遅れてイベントをトリガーするために使用します。イベントハンドラはhideOnScreen、ラベルを非表示にし、メモリをクリアする必要があるメソッドです。
問題は次のとおりです。
を呼び出すたびにQPixmap::fromImage、ピックスマップデータ用のメモリが割り当てられ、データがQImageメモリバッファからメモリバッファにコピーされQPixmapます。ラベルが非表示になった後も、QPixmapデータは割り当てられたままになります。さらに悪いことに、新しいQPixmap::fromImage呼び出しの後、新しいメモリチャンクが新しい画像に割り当てられ、古いデータはメモリから解放されません。これにより、メモリリークが発生します(テスト画像では、メソッド呼び出しごとにcca 10 MB)。どうすればそのリークを解決できますか?
プライベートQPixmap変数を作成し、QPixmap::fromImageそれによって作成されたpixmapを格納してから、メソッドでそのデストラクタを呼び出そうとしましたhideOnScreenが、役に立ちませんでした。
QPixmapから作成する非静的な方法はありますQImageか?またはさらに良いことに、QPixmapから直接作成する方法はありIplImage*ますか?
よろしくお願いします。