《QT从基础到进阶·十二》QPixmap.load加载图片不更新问题

简介: 《QT从基础到进阶·十二》QPixmap.load加载图片不更新问题

问题:多次用QPixmap加载图片时,图片无法更新。

示例代码如下:

QPixmap pixmap;
pixmap.load("1.png"); //加载图片1
label->setPixmap(pixmap); //设置到label中显示
pixmap.load("2.png"); //加载图片2
label->setPixmap(pixmap); //设置到label中显示
pixmap.load("1.png"); //加载图片1
label->setPixmap(pixmap); //设置到label中显示

我们期望的结果是当代码第一条label->setPixmap(pixmap); 时会在label上显示图片1,代码走到第二条label->setPixmap(pixmap); 时,label中的图片会被更新为图片2,代码走到第三条label->setPixmap(pixmap); 时,label中的图片又会被更新为图片1。

实际情况是label先显示图片1正常,从图片1跟新为图片2也正常,再从图片2跟新为图片1就无法跟新了,还是依旧显示图片2,这是为啥??

原因:QPixmap中的load函数是将图片加载到缓冲区,即QPixmapCache中存放图片,当把第一张图片加载到缓冲区会显示图片1,当加载第二张图片时缓冲区的图片1并没有被覆盖,实际是缓冲区存了两张图片,并显示图片2,当再次加载图片1到缓冲区时,这时QPixmapCache认为已经有了图片1,会直接返回true,缓冲区的图片排列顺序并没有发生变化,固依旧显示图片2。

解决办法:

(1)QPixmap直接定义局部变量,这样每次会开辟新的缓冲区

(2)每次加载图片时先清空缓冲区,调用QPixmapCache::clear()

(3)设置QPixmapCache缓冲区只能存放一张图片,QPixmapCache::setCacheLimit(1), 这样保证每次存放的图片都能覆盖前一张。


相关文章
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
330 0
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
|
8月前
|
缓存
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
428 0
《QT从基础到进阶·二十七》进度条QProgressBar
《QT从基础到进阶·二十七》进度条QProgressBar
207 0
《QT从基础到进阶·十三》QPixmap、QImage的缩放——
《QT从基础到进阶·十三》QPixmap、QImage的缩放——
367 0
|
C++ 容器
《QT从基础到进阶·三十》QVariant的基础用法
《QT从基础到进阶·三十》QVariant的基础用法
159 0
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
144 0
零基础VB教程016期:frame控件分组制作色板工具-案例实战
零基础VB教程016期:frame控件分组制作色板工具-案例实战
177 0
|
数据库
【自然框架】——Demo的源代码下载(2009-11-2更新)
 最新下载地址:自然框架的源代码、Demo、数据库、配置信息管理程序下载(2010.01.25更新)    数据库是SQLServer2005的,下载解压后附加数据库。 然后需要在web.config里面根据您的情况设置连接字符串。
859 0