C++ QPixmap';loadFromData函数使用了一些奇怪的缓存机制?
QPixmap的loadFromData函数有一个奇怪的现象。情况就是这样:C++ QPixmap';loadFromData函数使用了一些奇怪的缓存机制?,c++,qt,qpixmap,C++,Qt,Qpixmap,QPixmap的loadFromData函数有一个奇怪的现象。情况就是这样: QPixmap pix1(":/test1.png"); QPixmap pix2(":/test2.png"); ui->labelPix1>setPixmap(pix1); pix1 = pix2; ui->labelPix2->setPixmap(pix1); 在上面的代码中,两个标签控件加载了相同的QPixmap对象pix1,但pix1在labelPix2加载之前已经更改,因此
QPixmap pix1(":/test1.png");
QPixmap pix2(":/test2.png");
ui->labelPix1>setPixmap(pix1);
pix1 = pix2;
ui->labelPix2->setPixmap(pix1);
在上面的代码中,两个标签控件加载了相同的QPixmap对象pix1,但pix1在labelPix2加载之前已经更改,因此两个标签显示不同的图像(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,并使用与pix1相同的“test1.png”对其进行初始化。这次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”
我认为一定有某种机制。但我不知道它到底是什么。有人有什么想法吗?这是由于。我不知道这是不是故意的。但是如果你看,你会注意到它调用。这意味着它将不再在共享数据上运行。文档上说:每当pixmap的内容即将改变时,Qt就会自动将其分离。
但是现在当您查看时,您会注意到它没有调用
QPixmap::detach
。现在,正如我之前引用的文档一样,QPixmap::detach
应该在其内容即将更改时由Qt自动调用。那么在这种情况下为什么不呢?我不知道。您删除了另一个问题。我还打算回答这个问题。如果创建两个加载相同图像文件的pixmaps,它将只创建一次并将其存储在QPixmapCache
中。状态:请注意,从文件加载时,Qpixmap会自动添加到QPixmapCache中;使用的密钥是内部的,无法获取..哦,是的。我删除它只是因为你回答了这个问题,它只是关于“缓存机制”。所以也许我们不需要这么多类似的问题。非常感谢。