【问题标题】:QMultiMap with QVariant as key以 QVariant 为键的 QMultiMap
【发布时间】:2022-01-08 19:46:59
【问题描述】:

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

【问题讨论】:

  • 请附上minimal reproducible example。您给出的示例甚至不应该编译。
  • 只需将代码插入 main.无论如何,我编辑了这个问题。
  • 这是为你编译的吗?您使用的是哪个版本的 Qt?
  • Qt 5.14.2,您需要从 QtCreator 创建项目。需要的话我把工程文件也贴出来,你可以直接打开
  • QVariant::operator&lt; 已被弃用了 很长时间 时间,甚至没有出现在 current Qt5 documentation 中。

标签: c++ qt qvariant qmultimap


【解决方案1】:

这似乎是 Qt 中的一个错误,因为运算符 QVariant::operator&lt;() 不提供总排序,尽管 QByteArray::operator&lt;() 提供。 QMap 依赖于此(参见QMap documentation)。

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) 不能。

【讨论】:

    【解决方案2】:

    问题是没有合适的运营商

    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;
    }
    

    【讨论】:

    • 我想我找到了另一种解决方案,如果我用 toHex() 插入 QByteArray 就可以了。我不明白为什么 toHex() 函数返回另一个 QByteArray。可能是因为返回的 QByteArray 是可打印的?
    • QVariant 上已弃用的operator&lt; 调用Qvariant::compare,其中ends up comparing toString() of both QVariants,此时我失去了跟踪/兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多