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),这是正确的。

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

我认为必须有某种机制。但是我不知道它到底是什么。任何人都有想法吗?

最佳答案

这是由于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的内容即将发生更改,就应该由Qt自动调用QPixmap::detach。那么在这种情况下为什么不呢?我不知道

07-28 12:29