2016-12-21 30 views
0

イメージをqtラベルに表示したい。私はQByteArrayの形式で画像データを取得しており、ラベルに読み込んでいます。イメージを約500回読み込んだ後、このエラーはビジュアルスタジオQImageに表示されます:メモリ不足、ヌルイメージを返す

QPixmap *pixmapTest; 
pixmapTest = NULL; 

次のコードが呼び出さなっている機能である複数回

はコンストラクタで定義された:以下 はコードで約500回、この関数を呼び出した後

RequestCompleted(QNetworkReply *reply) 
{ 
if(pixmapTest){ 
    qDebug()<<"delete showImage Pixmap Object"; 
    delete pixmapTest; 
    pixmapTest = NULL; 
} 
pixmapTest = new QPixmap(); 
QByteArray jpegData = reply->readAll(); 
pixmapTest->loadFromData(jpegData); 
ui.qtLabel->setPixmap(*pixmapTest); 
} 

Iこのエラーが発生します

QImage: out of memory, returning null image. 

私はありません上記のコードで何がエラーになっていますか?誰かが私にこれを解決する方法を教えてもらえますか?

+1

が鳴ります。おそらく 'jpegData' ... – dtech

+0

新しいpixmapオブジェクトを作成するときは、毎回' pixmapTest'を一度作成してから 'loadFromData'を呼び出すのが奇妙です。参照:http://stackoverflow.com/questions/15316008/qimage-out-of-memory-returning-null-image –

+0

私はある時点で削除(pixMapTest)を行う必要があると仮定します。または、shared_ptr – pm100

答えて

1

何度も呼び出される関数内の変数(pixmapTest)のメモリの割り当てと割り当て解除は、十分意味がありません。最初にメモリを割り当て、すべてのメモリが割り当て解除されたら、まずメモリを割り当てます。例えば:あなたのアプリがメモリをリークしているよう

pixmapTest = new QPixmap(); 

for(size_t i = 0; i < 1000; i++){ 
    // Call that function 
} 

delete pixmapTest; 

これとは別に、それが聞こえます。 pixmapTestを削除すると、メモリjpegDataが削除されていないことに注意してください。したがって、各関数呼び出しでは、jpegDataが指すメモリを処理する必要があります。

+0

のようなスマートなポインタに入れておかなければなりません。 – sk110

0

おそらく、reply自体を解放していない可能性があります。

ピックスマップを保存する必要も、ポインタで管理する必要もありません。値をつけておき、返信を受け取るたびに新しい値を割り当ててください。あなたがメモリをリークしているよう

例えば:

class MyClass : public QWidget { 
    Q_OBJECT 
    Ui::MyClass ui; 

    explicit MyClass(QWidget *parent = nullptr) : QWidget(parent) { 
    ui.setupUi(this); 
    } 

    Q_SLOT void requestCompleted(QNetworkReply *reply) { 
    QPixmap pix; 
    pix.loadFromData(reply->readAll()); 
    ui.qtLabel->setPixmap(pix); 
    reply->deleteLater(); 
    } 
}; 
+0

これを行うには、私はこれらのエラーが発生している Pixmapはnull pixmapです これを見てください[http://stackoverflow.com/questions/41276248/getting-pixmap-is-a-null-pixmap-on-calling-a- function-500-times] – sk110

+0

あなたが受け取ったデータが正しいフォーマットではないかもしれません。どのようにそれを知ることができますか?それを確認してコードが意味を成すことを確認することはあなたの責任です。あなたは、単に「やあ、それはうまくいかない」と言っているのではなく、どんな質問をするべきかを知るのに十分に問題を理解しなければなりません。 –

+0

お寄せいただきありがとうございます。次の質問をする前にこの声明に留意します。 – sk110

関連する問題