我有一個以 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 來查看會發生什么,它只向地圖添加了一個元素。
有人可以向我解釋這種行為嗎?
我究竟做錯了什么?
uj5u.com熱心網友回復:
問題是沒有合適的 operator<。您可以使用此 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;
}
uj5u.com熱心網友回復:
這似乎是 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)不是。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378515.html
下一篇:Qt二進制檔案在哪里?
