我有一个以QVariant作为密钥的multimap,但它不适用于QByteArray。
funcion 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来查看发生了什么,它只向映射添加了一个元素。
有人能解释一下我的这种行为吗?
我做错了什么?
发布于 2021-12-02 11:34:56
它似乎是Qt中的一个bug,因为运算符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)不起作用。
发布于 2021-12-02 10:35:09
问题是没有合适的operator<。您可以使用此黑客来显示所需的行为:
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;
}https://stackoverflow.com/questions/70197414
复制相似问题