QVariants 与 QStringList 比较
QVariants with QStringList comparison
我在比较 QVariant
s 和里面的 QStringList
s 时有奇怪的观察结果。
代码:
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
== true,vle
和 veq
总是 false。
文档说它应该有效。我在某个地方错了还是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 中没有条目或多个条目,则 return 为空字符串,或者第一个条目,如果只有一个。
比较两个空字符串returns 0。将两个 QVariant 与一个条目进行比较会导致对两个字符串进行比较,而将两个 QVariant 与多个条目进行比较会导致类型被比较,产生 return 在所有情况下都是 1 的值,这导致 <
总是 returning 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
我在比较 QVariant
s 和里面的 QStringList
s 时有奇怪的观察结果。
代码:
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
== true,vle
和 veq
总是 false。
文档说它应该有效。我在某个地方错了还是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 中没有条目或多个条目,则 return 为空字符串,或者第一个条目,如果只有一个。
比较两个空字符串returns 0。将两个 QVariant 与一个条目进行比较会导致对两个字符串进行比较,而将两个 QVariant 与多个条目进行比较会导致类型被比较,产生 return 在所有情况下都是 1 的值,这导致 <
总是 returning 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