在Qt中为什么cacheKey对于相同的图标

时间:2016-07-13 18:21:25

标签: c++ qt

  • 采取表格
  • 在表单
  • 上放置两个CommandLinkBut​​ton
  • 在表单
  • 上放置一个PushButton
  • 右键单击PushButton->去插槽......
  • 选择点击()
  • 编写以下代码:
std::cout << ui->commandLinkButton->icon().cacheKey() << std::endl;
std::cout << ui->commandLinkButton_2->icon().cacheKey() << std::endl;

为什么该代码会为cachekey打印两个不同的值? 我们没有更改任何CommandLinkBut​​ton的图标,因此它们都具有相同的默认图标!

我的问题是这样的: 我有一个带有图标的按钮,它来自资源。 我想在测试代码中验证它上面有相同的必需图标。

为此,我比较按钮上的图像的缓存键和具有相同图像的QPixmap对象的缓存键:

const QPixmap image(":/MyProject/Images/Yellow_Icon_40x40.png");
if(image.cacheKey() == ui->PushButton->icon().cacheKey()) 
{
    cout<<"OK";
}

但该测试失败,因为cacheKey变得不同。 那么检查的最佳方法是什么? 基本上就像计算图像的哈希值并匹配该哈希值,对于同一图像的任何实例,该哈希值应始终相同。

1 个答案:

答案 0 :(得分:2)

这是因为两个图标在同一个缓存中不是cached和/或没有从同一个对象复制。请查看this答案和cacheKey文档的第2项。

要为不同的图标获取相同的cacheKey,您应该在窗口的构造函数中创建一个图标对象,并在其上为两个CommandLinkBut​​tons调用Could Not Follow Redirect Path Using data from https://www.domain.com/ because there was an error following the redirect path. Could Not Follow Redirect URL requested a HTTP redirect, but it could not be followed.

更新: 要通过散列将图标与文件中的位图进行比较,您需要一些基于数据的散列。幸运的是,Qt为连续内存块提供了一堆setIcon函数和qHashBits函数。您可以比较像这样的图像哈希:

qHash

这里我们以非常笨拙和不自然的方式获取图像原始数据,然后计算它的哈希值。这可能不是你想要的。 qHashBits返回的哈希值不是cacheKey返回的值。此外,这些哈希可能会有所不同,因为// assume image and icon object are declared as in your question QImage imImage = image.toImage(); QImage imIcon = ui->PushButton->icon().pixmap(QSize(1024,1024)).toImage(); auto hbImage = qHashBits(imImage.constBits(), imImage.byteCount()); auto hbIcon = qHashBits(imIcon.constBits(), imIcon.byteCount()); if(hbImage == hbIcon) {.......} 直接从文件加载,而image可能会在构建期间对其图像执行某些处理。 QIcon来自Qt的哈希表实现,因此它意味着输入数据的微小变化会导致返回哈希的重大变化。为了弥补可能的差异,您可以使用与界面中相同的选项从qHashBits构造QIcon对象,然后获取图标的数据。

从你的例子中不清楚,在比较之前要采取什么样的哈希?散列需要整个数据遍历,因此在将数千个图像与一个图像进行比较之前,只需image数据就不会更快。