QVariants与QStringList比较

时间:2016-07-20 21:56:35

标签: c++ qt qt5 qt5.7

在将QVariant s与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时,我的比较结果(legeeq)具有预期值。但它根本不会影响变体的结果。我总是得到vge == true,vleveq总是假的。

文档说它应该有效。我在某处错了还是Qt bug? 我正在使用Qt5.7。

修改

我已填写此问题的错误报告:https://bugreports.qt.io/browse/QTBUG-54893

1 个答案:

答案 0 :(得分:2)

很好。

以下是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

编辑:推送明确比较QVariants中的QStringLists的修复:https://codereview.qt-project.org/#/c/165886/1