QML引擎不会将bool-string QVarient隐式转换为bool属性

时间:2014-12-13 04:33:43

标签: c++ qt qml qt-quick

我在QSettings周围创建了一个Settings类包装器,它提供了以下QML访问方法:

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

在用户界面中,CheckBox实例如下所示:

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

QSettings将布尔值作为QString类型加载到QVariant中,为“true”或“false”(很好)。问题是当QML根据checked属性的需要将其隐式转换为布尔表达式时,它总是转换为true(即使它实际上是“false”)。我找到了一种解决方法来检测每当Settings :: value()中的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是QVariant(value.toBool()),这会导致内部类型实际上是bool。所以当内部类型是bool时,QML可以使隐式转换变得很好。据我所知,QML将varient字面上作为字符串,然后将其转换为bool,除非字符串为空,否则该bool始终为true。这是一个错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

ECMAScript language specification中所述,转换为布尔返回false,如果值为+ 0,-0,null,false,NaN,undefined或空字符串。所有其他值,包括任何对象或字符串" false",都转换为true

此外,在QML中,您可以使用Qt Labs Settings QML Type而不是QSettings的包装