2016-07-20 15 views
1

Ich habe seltsame Beobachtungen beim Vergleich QVariant s mit QStringList s innen.QVariants mit QStringList Vergleich

Code:

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; 

Als ich l1 meine Vergleichsergebnisse ändern (le, ge und eq) haben Werte erwartet. Aber es beeinflusst die Ergebnisse für Varianten überhaupt nicht. Ich bekomme immer vge == wahr, vle und veq sind immer falsch.

Docs sagen, es sollte funktionieren. Bin ich irgendwo falsch oder ist es Qt Bug? Ich benutze Qt5.7.

EDIT

ich einen Fehlerbericht für dieses Problem ausgefüllt haben: https://bugreports.qt.io/browse/QTBUG-54893

+0

Ich würde sagen, Sie sollten nicht erwarten, vernünftigen Vergleich zwischen QVariants, aber Jedenfalls vermute ich, dass es sich um einen Bug handelt, siehe die Implementierung: https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qvariant.cpp.html#_ZNK8QVariant7compareERKS_ – peppe

Antwort

2

Nice one. Hier

ist die genaue Zeile in dem Qt-Quellcode, die dieses Verhalten erzeugt: https://github.com/qt/qtbase/blob/4e41babd0337473a1078d3a5f3367cc1fc5f2935/src/corelib/kernel/qvariant.cpp#L3564

Es gibt keinen Sonderfall für QStringList daher QVariant :: toString() aufgerufen wird, die einen leeren String zurück, wenn es Nein oder mehr als ein Eintrag in der QStringList oder der erste Eintrag, wenn es nur einen Eintrag gibt.

Vergleicht man zwei leere Strings, erhält man 0 zurück. Vergleicht man zwei QVariant mit einem Eintrag, ergibt sich jeweils der Vergleich beider Strings und der Vergleich zweier QVariant mit mehr als einem Eintrag führt zu einem Vergleichswert, der in allen Fällen den Rückgabewert 1 ergibt , was in < führt immer false und > immer true.

Sieht aus wie ein Fehler für mich.

Beispiele:

// 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 

usw.


Edit: ein Update explizit gedrückt QStringLists in QVariants Vergleich: https://codereview.qt-project.org/#/c/165886/1