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

标签 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,但是在labelPix2加载它之前pix1已经被改变,所以两个标签显示不同的图像(test1.png和test2.png),这是正确的。

然后我们更改行“pix1 = pix2”,使用以下 block 代替:

QByteArray ba;
QBuffer buf(&ba);
pix2.save(&buf, "PNG");
pix1.loadFromData(ba);

在这个 block 中,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 .这意味着它将不再对共享数据进行操作。文档说:只要像素图的内容即将发生变化,Qt 就会自动分离像素图。

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

关于c++ - QPixmap 的 loadFromData 函数使用了一些奇怪的缓存机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26901307/

相关文章:

c++ - std::vector<unsigned char> 到 QPixmap

c++ - 在主窗口中显示 QImage

c++ - Boost 1.55 不适用于 Visual Studio 2013

Qt:测量事件处理时间

c++ - 使用 QGraphicsWebView 比使用 QWebView 有什么优势?

c++ - Qt 表格小部件垂直和水平标题变得不可见

c++ - Qt无法保存像素图

c++ - 错误: 'unordered_set' is not a member of 'std'

c++ - Opencv Mat vector 分配给矩阵的一行,最快的方法?

c++ - 删除所有具有零值的映射键