c++ - QVariants 与 QStringList 比较

标签 c++ qt qt5 qt5.7

在比较 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 时,我的比较结果(legeeq)具有预期值。但它根本不影响变体的结果。我总是得到 vge == true,vleveq 总是 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 中没有或多个条目,则返回空字符串,如果只有一个,则返回第一个条目.

比较两个空字符串返回 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

关于c++ - QVariants 与 QStringList 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491520/

相关文章:

c++ - 如何将字符串转换为 unicode 中的 wchar*

C++ 数组错误 C3646 : 'jarArray' : unknown override specifier

c++ - 在 Qt 5 中重用现有的 QDirIterator

qt - PyQt-QtableView header 。如何添加右上角的小按钮来隐藏/显示带有选中/未选中复选框的列?

c++ - Qt 5 中的宏 "QT_BEGIN_NAMESPACE"是什么意思?

c++ - Windows PC 上 Qt5.3 上的 Android 目标 QWebView,错误 : Unknown module(s) in QT: webkitwidgets

c++ - For 循环中的 OpenMP 并行部分 (C++) - 开销

c++ - 在C++中,当delete调用析构函数时,析构函数体是否在释放内存之前触发?

c++ - QStyledItemDelegate中如何根据qStylesheet进行绘画

c++ - 遍历 QLineSeries 项目及其点