《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), 这样保证每次存放的图片都能覆盖前一张。


相关文章
|
6月前
CocosCreator 面试题(十六)Cocos Creator 节点池的基本原理是什么?如何使用?
CocosCreator 面试题(十六)Cocos Creator 节点池的基本原理是什么?如何使用?
391 0
|
Android开发
Android开发教程 - 使用Data Binding(七)使用BindingAdapter简化图片加载
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fragment中的使用 ...
1148 0
|
12月前
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
261 0
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
|
6月前
|
缓存
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
358 0
|
12月前
《QT从基础到进阶·二十七》进度条QProgressBar
《QT从基础到进阶·二十七》进度条QProgressBar
164 0
|
12月前
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
127 0
|
12月前
|
缓存
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
580 0
零基础VB教程016期:frame控件分组制作色板工具-案例实战
零基础VB教程016期:frame控件分组制作色板工具-案例实战
149 0
|
JavaScript 前端开发
ue单文件组件(SPA)入门+入门案例
ue单文件组件(SPA)入门+入门案例
199 0
ue单文件组件(SPA)入门+入门案例
下一篇
无影云桌面