首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以QMultiMap为密钥的QVariant

以QMultiMap为密钥的QVariant
EN

Stack Overflow用户
提问于 2021-12-02 10:01:20
回答 2查看 291关注 0票数 0

我有一个以QVariant作为密钥的multimap,但它不适用于QByteArray。

funcion map.values("\xc2\x39\xc7\xe1")返回映射的所有值。

这是一个很小的例子:

代码语言:javascript
复制
#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来查看发生了什么,它只向映射添加了一个元素。

有人能解释一下我的这种行为吗?

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-02 11:34:56

它似乎是Qt中的一个bug,因为运算符QVariant::operator<()并不提供完全排序,即使QByteArray::operator<()提供了。而QMap则依赖于此(参见QMap文档)。

代码语言:javascript
复制
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)不起作用。

票数 1
EN

Stack Overflow用户

发布于 2021-12-02 10:35:09

问题是没有合适的operator<。您可以使用此黑客来显示所需的行为:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70197414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档