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尝试实例化两种颜色的比较器失败,这是不可能的。

问题是:是否可以将 QColor 存储在 QMap 中作为键值而不是引用?

只是好奇。我知道如何以其他方式写出我想要的东西。但令我感到奇怪的是,QT 中有关于我可以存储在地图中或不能存储的任何异常。

4

2 回答 2

5

不,因为QColor不提供operator<,这是'类型所必需的:QMapKey

a 的键类型QMap必须提供operator<()指定总订单。

一个选项是operator<QColor自己定义,但我不建议这样做,因为我不确定它是否应该被定义。

我建议只使用std::map自定义比较器(第三个模板参数),如下所示:

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 回答