У меня странные наблюдения при сравнении QVariant
с QStringList
внутри.
Код:
QStringList l1, l2;
l1 << "";
l2 << "33" << "434";
const bool le = l1 < l2;
const bool ge = l1 > l2;
const bool eq = l1 == l2;
QVariant v1(l1), v2(l2);
const bool vle = v1 < v2;
const bool vge = v1 > v2;
const bool veq = v1 == v2;
Когда я изменяю l1
мои результаты сравнения (le
, ge
а также eq
) ожидаемые значения. Но это никак не влияет на результаты для вариантов. Я всегда получаю vge
== правда, vle
а также veq
всегда ложны.
Документы говорят, что это должно работать. Я где-то ошибаюсь или это Qt ошибка?
Я использую Qt5.7.
РЕДАКТИРОВАТЬ
Я заполнил отчет об ошибке для этой проблемы: https://bugreports.qt.io/browse/QTBUG-54893
Хороший.
Вот точная строка в исходном коде Qt, которая производит это поведение: https://github.com/qt/qtbase/blob/4e41babd0337473a1078d3a5f3367cc1fc5f2935/src/corelib/kernel/qvariant.cpp#L3564
Для QStringList особого случая не существует, поэтому вызывается QVariant :: toString (), который возвращает пустую строку, если в QStringList нет или более одной записи, или первую запись, если есть только одна.
Сравнение двух пустых строк возвращает 0. Сравнение двух QVariant с одной записью, каждая из которых приводит к сравнению обеих строк, и сравнение двух QVariant с более чем одной записью приводит к тому, что тип сравнивается, и во всех случаях возвращается значение 1, что приводит к <
всегда возвращаюсь false
а также >
всегда true
,
Похоже, ошибка для меня.
Примеры:
// expected behaviour when both have a single entry
QStringList l, m;
l << "0";
m << "1";
QVariant less(l);
QVariant more(m);
less < more; // true
less > more; // false
QStringList l, m;
l << "1";
m << "0";
QVariant less(l);
QVariant more(m);
less < more; // false
less > more; // true
// ... or both have no entry
QStringList l, m;
QVariant less(l);
QVariant more(m);
less < more; // false
more < less; // false
more == less; // true
// otherwise, things get weird
QStringList l, m;
l << "0" << "1";
m << "2" << "3";
QVariant less(l);
QVariant more(m);
less < more; // false
more < less; // false
less > more; // true
more > less; // true
less == more; // false
QStringList l, m;
m << "2" << "3";
QVariant less(l);
QVariant more(m);
less < more; // false
more < less; // false
less > more; // true
more > less; // true
less == more; // false
и т.п.
Edit: внес исправление, явно сравнивающее QStringLists в QVariants: https://codereview.qt-project.org/#/c/165886/1
Других решений пока нет …