0

我有一个以 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 来查看会发生什么,它只向地图添加了一个元素。
有人可以向我解释这种行为吗?
我究竟做错了什么?

4

2 回答 2

1

问题是没有合适的操作符<。您可以使用此 hack 来显示所需的行为:

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;
}
于 2021-12-02T10:35:09.537 回答
1

这似乎是 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)

所以 aQByteArray可以作为 QMap 的键,但 aQVariant(QByteArray)不能。

于 2021-12-02T11:34:56.477 回答