2017-12-13 3 views
-1

重複して入力しなくても、選択したすべての色をリストに追加し、後で選択したすべての色をウィジェットにポップアップ表示する必要があります。QColor into later retrieval

にはどうすればリストにQColorを追加することができますし、後で

+0

'QList'の代わりに' QSet'を使用します。 –

+0

@DmitrySazonov、 'QSet'はアイテムの一意性を保証しません。 – vahancho

+0

QsetがQColorに対応していません – Sijith

答えて

2

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 Sを置くことができませんQRgbの値を(QColor::rgba()経由で)返し、QColor(QRgb)コンストラクタを介してQColorに再度変換します。