QPixmap的loadFromData函数使用了一些奇怪的缓存机制?

时间:2014-11-13 04:24:29

标签: 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加载之前已被更改,因此两个标签显示不同的图像(test1.png和test2.png),它&#39是的。

然后我们更改了行" 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"。

我认为必须有一些机制。但我不知道它究竟是什么。任何人都有一些想法吗?

1 个答案:

答案 0 :(得分:3)

这是由于implicit sharing。我不知道它是否有意。但是,如果你看QPixmap::load,你会发现它调用了QPixmap::detach。这意味着它将不再对共享数据进行操作。文档说:A pixmap is automatically detached by Qt whenever its contents are about to change.

但是现在当你看QPixmap::loadFromData时,你会注意到它没有调用QPixmap::detach。现在,当我引用之前的文档时,Qt会在其内容即将发生变化时自动调用QPixmap::detach。那么为什么不在这种情况下呢?我不知道。