我想在qt标签上显示图片。我以QByteArray
的形式获取图像数据,并将其加载到标签中。
以下是代码:
在构造函数
中定义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.
我没有得到上面代码中的错误。有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:1)
首先,在多次调用的函数中为变量(pixmapTest
)分配和取消分配内存是不够的。您应该先分配内存,然后在完成所有内容后重新分配内存。例如:
pixmapTest = new QPixmap();
for(size_t i = 0; i < 1000; i++){
// Call that function
}
delete pixmapTest;
除此之外,听起来你的应用程序正在泄漏内存。请注意,通过删除pixmapTest
,您不会删除指向的内存jpegData
。因此,在每个函数调用中,您应该处理jpegData
指向的内存。
答案 1 :(得分:0)
最有可能的是,您并没有释放reply
本身。
也不需要存储像素图,也不需要通过指针管理像素图。按值保留,并在每次收到回复时分配新值。
E.g:
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();
}
};