【发布时间】:2014-11-13 04:24:29
【问题描述】:
QPixmap 的 loadFromData 函数有一个奇怪的现象。是这样的:
QPixmap pix1(":/test1.png");
QPixmap pix2(":/test2.png");
ui->labelPix1>setPixmap(pix1);
pix1 = pix2;
ui->labelPix2->setPixmap(pix1);
在上面的代码中,拖曳标签控件加载了相同的QPixmap对象pix1,但是在labelPix2加载它之前pix1已经改变,所以拖曳标签显示不同的图像(test1.png和test2.png),是的。
然后我们改变“pix1 = pix2”这一行,使用下面的代码块来代替:
QByteArray ba;
QBuffer buf(&ba);
pix2.save(&buf, "PNG");
pix1.loadFromData(ba);
在此块中,pix1 在 labelPix1 设置后从 pix2 加载字节数据。显然 labelPix2 显示图像“test2.png”,但奇怪的是 labelPix1 还显示图像“test2.png”(它们显示相同的图像)。
另外,我们引入第三个 QPixmap 对象 pix3 并将其初始化为“test1.png”,与 pix1 相同。这次 labelPix2 不设置 pix1 而是在 pix1 从 pix2 加载字节数据后设置 pix3。就像这样:
QPixmap pix1(":/test1.png");
QPixmap pix2(":/test2.png");
QPixmap pix3(":/test1.png");
ui->labelPix1>setPixmap(pix1);
QByteArray ba;
QBuffer buf(&ba);
pix2.save(&buf, "PNG");
pix1.loadFromData(ba);
ui->labelPix2->setPixmap(pix3);
哦,labelPix1 和 labelPix3 显示的是同一张图片,“test2.png”。
我认为一定有某种机制。但我不知道它到底是什么。有没有人有什么想法?
【问题讨论】:
-
您删除了其他问题。我也打算回答这个问题。如果您创建两个加载相同图像文件的像素图,它只会创建一次并将其存储在
QPixmapCache中。QPixmap::load声明:请注意,当从文件加载时,QPixmap 会自动添加到 QPixmapCache;使用的密钥是内部的,无法获取。. -
哦,是的。我删除只是因为你回答了这个问题,它只是关于“缓存机制”。所以也许我们不需要这么多类似的问题。非常感谢。