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