当比较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。
编辑
我已经为这个问题填写了一个bug报告:https://bugreports.qt.io/browse/QTBUG-54893
发布于 2016-07-20 23:29:09
干得好。
下面是生成这种行为的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:https://codereview.qt-project.org/#/c/165886/1中显式地比较QVariants:https://codereview.qt-project.org/#/c/165886/1中的修复
https://stackoverflow.com/questions/38491520
复制相似问题