gpt4 book ai didi

c++ - 如果有的话,有没有办法获得 QColor 的智能名称?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:15 27 4
gpt4 key购买 nike

我按名称(“红色”、“绿色”)创建了一种颜色,但稍后当我询问它的名称时,我得到了 RGB 信息。有没有办法检索颜色名称(如果有的话)(显然,它们不可能都有名称)。

#include <QColor>
#include <iostream>

int main( int argc, char* argv[] )
{
QColor color( "red" );
std::cout << color.name().toStdString();
return 0;
}

这会输出“#ff0000”,我希望它输出“red”。

最佳答案

我从文档中看到的唯一方法是遍历 Qt 知道的所有命名颜色(由 QColor::colorNames() 提供),将每个颜色转换为 QColor并检查颜色是否匹配(operator== 可用 QColor)。

如果您想重复执行此操作,建议使用某种 map 而不是不断地进行线性搜索。 QColor不直接作为映射键(没有 operator< 也没有哈希函数),但我们可以使用它的底层 RGBA 值。如果我们为此编写自定义代码,我们也可以通过避免(出于我们的目的)低效的 map/unordered_map 实现并改用对排序 vector 的二进制搜索来获得正确的性能方面:

// Lookup class that is only accessible from getColorName free function.
class NamedQColorLookup
{
private:
NamedQColorLookup()
{
auto keyList = QColor::colorNames();

// Simple implementation for filling _keys and _values using std::map.
// Alternatively, sort two vectors at once, for example like
// https://stackoverflow.com/questions/17074324/how-can-i-sort-two-vectors-in-the-same-way-with-criteria-that-uses-only-one-of
// But that's less readable and (since it's only done once) has no meaningful performance impact.
std::map<std::uint64_t, QString> colorMap;
for (const auto& key : keyList)
colorMap.emplace(QColor(key).rgba64(), key);

// Convert to faster and smaller vector lookup.
_keys.reserve(colorMap.size());
_values.reserve(colorMap.size());
for (const auto& [key, value] : colorMap)
{
_keys.emplace_back(key);
_values.emplace_back(value);
}
}

QString getName(const QColor& color) const
{
auto rgba = color.rgba64();
// Binary search for the RGBA value.
auto [notLessThan, greaterThan] = std::equal_range(_keys.begin(), _keys.end(), rgba);

// If this is not a named color, return the RGB code instead.
if (notLessThan == greaterThan)
return color.name();

// We found a matching ARGB value, obtain its index.
auto index = std::distance(_keys.begin(), notLessThan);
return _values[index];
}

std::vector<std::uint64_t> _keys;
std::vector<QString> _values; // ...or some kind of string view if you want.

friend QString getColorName(const QColor& color);
};

// The interface for color -> name lookups.
QString getColorName(const QColor& color)
{
static NamedQColorLookup lookup;
return lookup.getName(color);
}

我们可以使用 std::vector<std::pair<std::uint64_t, QString>>而不是两个单独的 vector ,但这会使二进制搜索变慢(更多缓存未命中)。

在这里玩:https://godbolt.org/z/z1fgyc

关于c++ - 如果有的话,有没有办法获得 QColor 的智能名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com