3

だから、私は簡単なコードを持っています

QMap<QColor, int> colors;
for(int w = 0; w < image.width(); ++w)
    for (int h = 0; h < image.height(); ++h)
        colors[QColor::fromRgb(image.pixel(w,h))]++;

エラーメッセージは

'operator<' に一致しません (オペランドの型は 'const QColor' と 'const QColor' です)。

そのため、qMapLessThanKeyは 2 つの色の比較子をインスタンス化しようとして失敗しましたが、それは不可能です。

質問: QColor を参照ではなくキーとして値として QMap に格納することは可能ですか?

ちょっと興味があるんだけど。私は自分が望むものを他の方法で書く方法を知っています。しかし、マップに保存できるものとできないものについて、QTに例外があるのは奇妙に思えます。

4

2 に答える 2

5

いいえ、のタイプに必要なQColor提供しないため:operator<QMapKey

のキー タイプは、合計順序を指定するQMap必要があります。operator<()

オプションは自分で定義するoperator<ことQColorですが、定義されるべきかどうかわからないので、お勧めしません。

std::map次の行に沿って、カスタム コンパレータ (3 番目のテンプレート引数) と共に使用することをお勧めします。

struct color_compare {
    bool operator()(QColor const&, QColor const&) { /* ... */ }
};

std::map<QColor, Value, color_compare> map;
// ...
于 2015-09-10T21:54:42.803 に答える
1

もちろん、それは可能です。これは欠落している Qt 機能です。R、G、B、A 値を辞書順に比較して、比較演算子を自分で実装できます。

// https://github.com/KubaO/stackoverflown/tree/master/questions/qmap-qcolor-32512125
#include <QtGui>

bool operator<(const QColor & a, const QColor & b) {
   return a.redF() < b.redF()
       || a.greenF() < b.greenF()
       || a.blueF() < b.blueF()
       || a.alphaF() < b.alphaF();
}

int main() {
   Q_ASSERT(QColor(Qt::blue) < QColor(Qt::red));
   Q_ASSERT(QColor(Qt::green) < QColor(Qt::red));
   Q_ASSERT(QColor(Qt::blue) < QColor(Qt::green));
   Q_ASSERT(! (QColor(Qt::red) < QColor(Qt::red)));
   QMap<QColor, int> map;
   map.insert(Qt::red, 0);
   map.insert(Qt::green, 1);
   map.insert(Qt::blue, 2);
   Q_ASSERT(map.size() == 3);
   Q_ASSERT(map.cbegin().key() == Qt::red);
   Q_ASSERT((map.cbegin()+1).key() == Qt::green);
   Q_ASSERT((map.cbegin()+2).key() == Qt::blue);
}
于 2015-09-11T14:15:25.390 に答える