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"。
我认为必须有一些机制。但我不知道它究竟是什么。任何人都有一些想法吗?
答案 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
。那么为什么不在这种情况下呢?我不知道。