2014-12-13 6 views
2

을 bool로하는 부울 문자열 QVarient 변환하지 :QML 엔진은 암시 적으로 내가 QML에서 액세스를 위해 다음과 같은 방법을 제공 QSettings 주위에 설정 클래스 래퍼 만든 재산

Q_INVOKABLE void setValue(Key key, const QVariant &newValue); 
Q_INVOKABLE QVariant value(Key key); 

사용자 인터페이스를 체크 상자가 있습니다 (미세하다) "true"또는 "false"로 QString 유형으로 QVariant에 부울 값을

CheckBox { 
    checked: Settings.value(Settings.KeySomeBoolSettings) 
} 

QSettings로드 : 다음과 같이 인스턴스. 문제는 QML이 이것을 암시 적으로 checked 속성에서 필요에 따라 부울 식으로 변환하고 항상 true로 변환하는 것입니다 (실제로 "false"인 경우에도 마찬가지입니다). Settings :: value()의 QVariant가 실제로 부울임을 감지 할 수있는 해결 방법을 발견했습니다. 검출 된 경우, 실제 QVariant 반환

QVariant Settings::value(Key key) 
{ 
    QVariant value = mSettings->value(stringNameForKey(key), mDefaultValues[key]); 

    //this block is the workaround 
    if (QString(value.typeName()) == "QString" && 
     (value.toString() == "false" || value.toString() == "true")) 
     return QVariant(value.toBool()); 

    return value; 
} 

는 QVariant은 (value.toBool())로 실제로 BOOL 내부 형식을 일으키는 것이다. 따라서 내부 유형이 부울이면 QML은 암시 적 변환을 올바르게 만들 수 있습니다. 내가 말할 수있는 바에 따르면, QML은 문자열을 문자 그대로 취한 다음, 문자열이 비어 있지 않으면 항상 참인 부울로 변환합니다. 이것은 버그입니까, 아니면 제가 잘못하고있는 것입니까?

+1

주위 래퍼의 Qt Labs Settings QML Type를 사용할 수 있습니까? 사실인가 거짓인가? OK, Not OK? 맞거나 틀린가요? 하나 또는 제로? 1 또는 0? 너무 많은 문자열 변형이있을 수 있습니다. – lpapp

+0

좋은 지적. 어떤 이유로 나는 QML 엔진이 bool-string을 bool로 변환하여 Javascript로 넘겨주기를 기대했습니다. 하지만 실제로는 의미가 없으며 실제로는 모호합니다. –

답변

0

ECMAScript language specification에 설명 된 것처럼 값이 +0, -0, null, false, NaN, undefined 또는 빈 문자열 인 경우 부울 반환 false으로 변환합니다. 모든 객체 또는 문자열 "false"를 포함한 다른 모든 값은 true으로 변환됩니다.

또한, QML에서 대신 QSettings 프로그래밍 언어 사양이 합리적인 것을 포함하는 방법