Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPixmap';loadFromData函数使用了一些奇怪的缓存机制?_C++_Qt_Qpixmap - Fatal编程技术网

C++ 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的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”

我认为一定有某种机制。但我不知道它到底是什么。有人有什么想法吗?

这是由于。我不知道这是不是故意的。但是如果你看,你会注意到它调用。这意味着它将不再在共享数据上运行。文档上说:
每当pixmap的内容即将改变时,Qt就会自动将其分离。


但是现在当您查看时,您会注意到它没有调用
QPixmap::detach
。现在,正如我之前引用的文档一样,
QPixmap::detach
应该在其内容即将更改时由Qt自动调用。那么在这种情况下为什么不呢?我不知道。

您删除了另一个问题。我还打算回答这个问题。如果创建两个加载相同图像文件的pixmaps,它将只创建一次并将其存储在
QPixmapCache
中。状态:请注意,从文件加载时,Qpixmap会自动添加到QPixmapCache中;使用的密钥是内部的,无法获取..哦,是的。我删除它只是因为你回答了这个问题,它只是关于“缓存机制”。所以也许我们不需要这么多类似的问题。非常感谢。