不同的QPix地图对象打开同一个文件可能互相影响
不同的QPixmap对象打开同一个文件可能互相影响?
项目里会在不同的界面显示用户头像,当用户没有头像的时候,会有一个“默认”的图像。这里在不同的界面用QLabel来载入QPixmap,那么QPixmap会先用“默认”头像初始化,之后去读取用户的数据,如果有头像数据(QByteArray),通过loadFromData方法来载入数据。结果奇怪的现象发生了,只要是用"default.png"文件初始化过的QPixmap对象,在其中一个调用loadFromData以后,其他的都变了。以下是相关片段:
以上代码中,pix1和pix3用同一文件初始化,中途pix1通过loadFromData载入pix2的数据,结果,显示出来的pix1和pix3居然都是pix2载入的图片。
求解释!
------解决思路----------------------
刚刚试了下,还真是这样。。。
不过完全可以不用QByteArray的方式啊,直接pix.load(),这样是不会出现你说的情况的
------解决思路----------------------
这种BUG肯定是编码时没考虑到造成的,不可能是考量后弄这么个结果出来。
为了性能的提升,QPixmap 内部使用 cache 和 隐式共享 两种技术。这个BUG 是修改共享的QPixmap时内部数据没能正确 detach 造成的。
------解决思路----------------------
cache技术,即载入同一路径的同一文件,下次直接从cache中取了。
项目里会在不同的界面显示用户头像,当用户没有头像的时候,会有一个“默认”的图像。这里在不同的界面用QLabel来载入QPixmap,那么QPixmap会先用“默认”头像初始化,之后去读取用户的数据,如果有头像数据(QByteArray),通过loadFromData方法来载入数据。结果奇怪的现象发生了,只要是用"default.png"文件初始化过的QPixmap对象,在其中一个调用loadFromData以后,其他的都变了。以下是相关片段:
QPixmap pix1(":/default.png");
QPixmap pix2(":/not_default.png");
QPixmap pix3(":/default.png");
ui->labelPix1->setPixmap(pix1);
QByteArray ba;
QBuffer buf(&ba);
pix2.save(&buf, "PNG");
pix1.loadFromData(ba);
ui->labelPix2->setPixmap(pix3);
以上代码中,pix1和pix3用同一文件初始化,中途pix1通过loadFromData载入pix2的数据,结果,显示出来的pix1和pix3居然都是pix2载入的图片。
求解释!
------解决思路----------------------
刚刚试了下,还真是这样。。。
不过完全可以不用QByteArray的方式啊,直接pix.load(),这样是不会出现你说的情况的
------解决思路----------------------
这种BUG肯定是编码时没考虑到造成的,不可能是考量后弄这么个结果出来。
为了性能的提升,QPixmap 内部使用 cache 和 隐式共享 两种技术。这个BUG 是修改共享的QPixmap时内部数据没能正确 detach 造成的。
------解决思路----------------------
cache技术,即载入同一路径的同一文件,下次直接从cache中取了。