QColor в список для последующего поиска

Я хочу добавить все выбранные цвета в список без повторяющихся записей, и позже все выбранные цвета должны появиться в виджете.

Как я могу добавить QColor в список, а затем распаковать его

1 ответ

Решение

QColor не предоставляет хэш-функцию для QSet или же std::unordered_set по умолчанию. Вы можете добавить это локально (или глобально для вашей программы), хотя, делегируя это хэш-функции для QRgb (которая также включает в себя альфа-значение):

#include <QColor>
#include <QDebug>
#include <QSet>

#include <unordered_set>

// hash function for QColor for use in QSet / QHash
QT_BEGIN_NAMESPACE
uint qHash(const QColor &c)
{
    return qHash(c.rgba());
}
QT_END_NAMESPACE

// hash function for QColor for std::unordered_set
namespace std {
template<> struct hash<QColor>
{
    using argument_type = QColor;
    using result_type = size_t;
    result_type operator()(const argument_type &c) const
    {
        return hash<QRgb>()(c.rgba());
    }
};
} // namespace std


int main(int argc, char *argv[])
{
    QSet<QColor> qs;
    qs.insert(QColor(100, 100, 100));
    qs.insert(QColor(100, 100, 100));
    qs.insert(QColor(50, 100, 100));
    qDebug() << qs.size() << qs.toList();

    std::unordered_set<QColor> ss;
    ss.insert(QColor(100, 100, 100));
    ss.insert(QColor(100, 100, 100));
    ss.insert(QColor(50, 100, 100));
    qDebug() << ss.size();
    for (auto c : ss)
        qDebug() << c;

    return 0;
}

Или вы также не можете поставить QColorв набор, но QRgb значения (через QColor::rgba()), а затем преобразовать их обратно в QColor через QColor(QRgb) опять конструктор.

Другие вопросы по тегам