QVariants со сравнением QStringList

У меня странные наблюдения при сравнении 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

1

Решение

Хороший.

Вот точная строка в исходном коде 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]