2016-12-21 15 views
0

Я хочу показать изображение на метке qt. Я получаю данные изображения в форме QByteArray, и я загружаю его в ярлык. Ниже приведен код:После загрузки изображения примерно 500 раз эта ошибка отображается в визуальной студии QImage: из памяти, возвращая нулевое изображение

определены в конструкторе

QPixmap *pixmapTest; 
pixmapTest = NULL; 

следующий код в функции, которая вызывалась несколько раз:

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); 
} 

После вызова этой функции около 500 раз, я я получаю эту ошибку

QImage: out of memory, returning null image. 

Я не являюсь t получение того, что является ошибкой в ​​вышеуказанном коде. Может кто-нибудь, пожалуйста, скажите мне, как это решить?

+1

Похоже, вы утечка памяти. Вероятно, 'jpegData' ... – dtech

+0

Создавать новый объект pixmap каждый раз кажется странным, лучше всего создать« pixmapTest »один раз, а затем просто вызвать' loadFromData'. См. Также: http://stackoverflow.com/questions/15316008/qimage-out-of-memory-returning-null-image –

+0

Я предполагаю, что вам нужно сделать delete (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.

Также нет необходимости хранить pixmap или управлять им с помощью указателя. Держите его по значению и присваивайте новое значение каждый раз, когда вы получаете ответ.

т.д .:

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 - это нуль-pixmap посмотреть на это [http://stackoverflow.com/questions/41276248/getting-pixmap-is-a-null-pixmap-on-calling-a- function-500-times] – sk110

+0

Ну, возможно, данные, которые вы получаете, не в правильном формате. Как мы могли узнать об этом? Вы должны проверить это и убедиться, что код имеет смысл. Вы должны понять проблему достаточно хорошо, чтобы знать, какие вопросы задавать, а не просто сказать «эй, это не работает». –

+0

спасибо за ваше ценное предложение. Я буду иметь в виду это заявление, прежде чем задавать следующий вопрос. – sk110