2016-07-20 5 views
1

QVariantQStringList 안에 비교할 때 이상한 관찰이 있습니다.QStringList를 비교 한 QVariants

코드 :

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, geeq)를 수정

이 예상 한 값. 그러나 변종에 대한 결과에는 전혀 영향을 미치지 않습니다. 항상 vge == true, vleveq은 항상 거짓입니다.

문서에 따르면 작동한다고합니다. 어딘가 잘못되었거나 Qt 버그입니까? Qt5.7을 사용하고 있습니다.

나는이 문제에 대한 버그 리포트를 작성했습니다

편집 : https://bugreports.qt.io/browse/QTBUG-54893

+0

내가, 당신이 QVariants 간의 합리적인 비교를 기 대해서는 안 말을하지만, 어쨌든 강력하게 버그라고 생각합니다. 구현 : cf : https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qvariant.cpp.html#_ZNK8QVariant7compareERKS_ – peppe

답변

2

니스 하나. 이 경우 빈 문자열을 반환이라고 https://github.com/qt/qtbase/blob/4e41babd0337473a1078d3a5f3367cc1fc5f2935/src/corelib/kernel/qvariant.cpp#L3564

가 QStringList에 대한 특별한 경우가 없다, 그러므로 QVariant :: toString() : 여기

이 동작을 생산하는 Qt는 소스 코드의 정확한 라인 아니오 또는 QStringList에 둘 이상의 항목이 있거나, 첫 x 째 항목이있는 경우 첫 x 째 항목.

두 개의 빈 문자열을 비교하면 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