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;
}
Другие вопросы по тегам