C++ QML引擎未将布尔字符串QVarient隐式转换为布尔属性

C++ QML引擎未将布尔字符串QVarient隐式转换为布尔属性,c++,qt,qml,qt-quick,C++,Qt,Qml,Qt Quick,我已经围绕QSettings创建了一个设置类包装器,该包装器为QML中的访问提供了以下方法: Q_INVOKABLE void setValue(Key key, const QVariant &newValue); Q_INVOKABLE QVariant value(Key key); 在用户界面中,有如下复选框实例: CheckBox { checked: Settings.value(Settings.KeySomeBoolSettings) } QSettings将

我已经围绕QSettings创建了一个设置类包装器,该包装器为QML中的访问提供了以下方法:

Q_INVOKABLE void setValue(Key key, const QVariant &newValue);
Q_INVOKABLE QVariant value(Key key);
在用户界面中,有如下复选框实例:

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将变量按字面意思作为字符串,然后将其转换为布尔值,除非字符串为空,否则布尔值始终为真。这是一个错误,还是我做错了什么?

如中所述,如果值为+0、-0、null、false、NaN、未定义或空字符串,则转换为布尔返回值
false
。所有其他值,包括任何对象或字符串“false”,都转换为
true


此外,在QML中,您可以使用QSettings代替包装器

任何编程语言规范如何涵盖这一点?对还是错?好,还是不好?对还是错?一还是零?1还是0?等等。可能有太多的字符串变化。很好。出于某种原因,我希望QML引擎在将bool字符串转换为Javascript之前将其转换为bool。但这真的没有意义,而且实际上相当含糊。