std::cout << ui->commandLinkButton->icon().cacheKey() << std::endl;
std::cout << ui->commandLinkButton_2->icon().cacheKey() << std::endl;
为什么该代码会为cachekey打印两个不同的值? 我们没有更改任何CommandLinkButton的图标,因此它们都具有相同的默认图标!
我的问题是这样的: 我有一个带有图标的按钮,它来自资源。 我想在测试代码中验证它上面有相同的必需图标。
为此,我比较按钮上的图像的缓存键和具有相同图像的QPixmap对象的缓存键:
const QPixmap image(":/MyProject/Images/Yellow_Icon_40x40.png");
if(image.cacheKey() == ui->PushButton->icon().cacheKey())
{
cout<<"OK";
}
但该测试失败,因为cacheKey变得不同。 那么检查的最佳方法是什么? 基本上就像计算图像的哈希值并匹配该哈希值,对于同一图像的任何实例,该哈希值应始终相同。
答案 0 :(得分:2)
这是因为两个图标在同一个缓存中不是cached和/或没有从同一个对象复制。请查看this答案和cacheKey文档的第2项。
要为不同的图标获取相同的cacheKey,您应该在窗口的构造函数中创建一个图标对象,并在其上为两个CommandLinkButtons调用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
数据就不会更快。