【问题标题】:QPixmap's loadFromData function used some strange mechanism for cache?QPixmap 的 loadFromData 函数使用了一些奇怪的缓存机制?
【发布时间】:2014-11-13 04:24:29
【问题描述】:

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”这一行,使用下面的代码块来代替:

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”。

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

【问题讨论】:

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

标签: c++ qt qpixmap


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2011-12-05
    相关资源
    最近更新 更多