2010-11-24 19 views
1

QGraphicsSceneとQPixmapを扱うときに問題が発生しました。 カメラで撮影したフレームを順次表示しています。 QTimerオブジェクトは100msごとにupdateSingleView()関数を呼び出しています。それは私の内側の関数である:scenes.at(0)->addPixmap(QPixmap::fromImage(Img));を呼び出すときに、私はremoveItem機能が古いQPixmapのを破壊するが、どうやらそのべきではないと考え、QGraphicsSceneからQpixmapを削除する

void CCIGui::updateSingleView() 
{ 

    unsigned char *const img = PGRSystem->SnapShot(); 

    QImage Img(img, 1024, 768, QImage::Format_RGB888); 

    scenes.at(0)->removeItem(scenes.at(0)->items().at(0)); 
    scenes.at(0)->addPixmap(QPixmap::fromImage(Img)); 

    ui_camViews.at(0).graphicsView->setScene(scenes.at(0)); 

    delete [] img; 
} 

GUIは、カメラのビューが表示されているが、生憎、メモリリークがあります。なぜ漏れが発生し、それを解決するのか知っていますか? Qtのドキュメントから

+0

Qtのどのバージョンですか?私は4.6でいくつか問題があった。 Windowsの場合 – sje397

+0

Qtバージョン4.6.3を使用しています。 – Marcin

答えて

1

としては、あなたがremoveItemラインの後に項目を削除する必要が

を示唆しました。

すなわち

QPointerの_item = scenes.at(0) - >アイテム()(0)で、。 scenes.at(0) - > removeItem(_item); 削除_item;

scenes.at(0) - > addPixmap(QPixmap :: fromImage(Img));

.....

2

無効QGraphicsScene :: removeItem(QGraphicsItem *項目)

は、シーンからアイテムアイテムとそのすべての子を削除します。アイテムの所有権が呼び出し元に渡されます(つまり、QGraphicsSceneは破棄されたアイテムを削除しません)。

関連項目addItem()も参照してください。

したがって、deleteを使用してアイテムを手動で削除する必要があります。

http://doc.trolltech.com/4.7/qgraphicsscene.html#removeItem

+0

もっと正確になりますか?私は 'new'で作成されなかったので、 'delete'を使ってItemを削除することはできません(Pixmapの場合と同じです)。 – Marcin

+2

addPixamp()、およびQGraphicsSceneの同様のヘルパーは、QGraphicsItem(この場合はQGraphicsPixmapItem)を(新しいを介して)作成する単純なラッパーです。したがって、アイテムがシーンから削除された後で、これを削除する必要があります。 –

+0

また、所有権を定義していないSnapShot()メソッドを使用してchar配列を返すと、混乱が生じる可能性があります.QByteArrayはこれには完全であり、delete []は必要ありません。 –

関連する問題