QMultiMap с QVariant в качестве ключа
У меня есть мультикарта с QVariant в качестве ключа, но она не работает с QByteArray.
Функция map.values("\xc2\x39\xc7\xe1") возвращает все значения карты.
Это небольшой пример:
#include <QCoreApplication>
#include <QMultiMap>
#include <QVariant>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMultiMap<QVariant, QString> map;
QByteArray b1("\xc1\x39\xc7\xe1");
QByteArray b2("\xc1\x39\xc7\xe2");
map.insert(QVariant(b1), "TEST1");
map.insert(QVariant(b2), "TEST2");
QStringList values = map.values(QByteArray("\xc1\x39\xc7\xe1"));
return a.exec();
}
Я также пытался использовать QMap, чтобы посмотреть, что происходит, и он добавляет на карту только элемент.
Может кто-нибудь объяснить мне такое поведение?
Что я делаю не так?
2 ответа
Похоже, это ошибка в Qt, потому что оператор
QVariant::operator<()
не обеспечивает полного порядка, хотя
QByteArray::operator<()
делает. И QMap полагается на это (см. документацию QMap ).
QByteArray b1("\xc1\x39\xc7\xe1");
QByteArray b2("\xc1\x39\xc7\xe2");
QVariant v1(b1);
QVariant v2(b2);
assert(b1 < b2 != b2 < b1); // works as expected for QByteArray
assert(v1 != v2); // make sure the values are actually not equal
assert(v1 < v2 != v2 < v1); // fails for QVariant(QByteArray)
Итак,
QByteArray
работает как ключ к QMap, но
QVariant(QByteArray)
не.
Проблема в отсутствии подходящего оператора <. Вы можете использовать этот хак, чтобы показать желаемое поведение:
bool operator<(const QVariant& lhs, const QVariant& rhs)
{
if (lhs.userType() == QMetaType::QByteArray && rhs.userType() == QMetaType::QByteArray)
{
return lhs.toByteArray() < rhs.toByteArray();
}
// The rest is up to you.
return true;
}