是否可以将 QColor 作为键存储在 QMap 中
Is it possible to store QColor in a QMap as key
所以,我有简单的代码
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))]++;
错误信息是
no match for 'operator<' (operand types are 'const QColor' and 'const QColor').
因此,qMapLessThanKey 尝试实例化两种颜色的比较器失败,这是不可能的。
问题是:是否可以将 QColor 作为键作为值而不是通过引用存储在 QMap 中?
只是好奇。我知道如何用其他方式写出我想要的东西。但我觉得奇怪的是,QT 中关于我可以存储在地图中或不能存储的内容有任何例外。
不,因为 QColor
doesn't provide operator<
, which is required 通过 QMap
的 Key
类型:
The key type of a QMap
must provide operator<()
specifying a total order.
一个选项是自己为 QColor
定义 operator<
,但我不建议这样做,因为我不确定是否应该定义它。
我建议仅将 std::map
与自定义比较器(第三个模板参数)一起使用:
struct color_compare {
bool operator()(QColor const&, QColor const&) { /* ... */ }
};
std::map<QColor, Value, color_compare> map;
// ...
当然,这是可能的。这是缺少的 Qt 功能。您可以自己实现比较运算符,按字典顺序比较 R、G、B、A 值:
// https://github.com/KubaO/Whosebugn/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);
}
所以,我有简单的代码
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))]++;
错误信息是
no match for 'operator<' (operand types are 'const QColor' and 'const QColor').
因此,qMapLessThanKey 尝试实例化两种颜色的比较器失败,这是不可能的。
问题是:是否可以将 QColor 作为键作为值而不是通过引用存储在 QMap 中?
只是好奇。我知道如何用其他方式写出我想要的东西。但我觉得奇怪的是,QT 中关于我可以存储在地图中或不能存储的内容有任何例外。
不,因为 QColor
doesn't provide operator<
, which is required 通过 QMap
的 Key
类型:
The key type of a
QMap
must provideoperator<()
specifying a total order.
一个选项是自己为 QColor
定义 operator<
,但我不建议这样做,因为我不确定是否应该定义它。
我建议仅将 std::map
与自定义比较器(第三个模板参数)一起使用:
struct color_compare {
bool operator()(QColor const&, QColor const&) { /* ... */ }
};
std::map<QColor, Value, color_compare> map;
// ...
当然,这是可能的。这是缺少的 Qt 功能。您可以自己实现比较运算符,按字典顺序比较 R、G、B、A 值:
// https://github.com/KubaO/Whosebugn/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);
}