我在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。这是一个错误,还是我做错了什么?
答案 0 :(得分:0)
如ECMAScript language specification中所述,转换为布尔返回false
,如果值为+ 0,-0,null,false,NaN,undefined或空字符串。所有其他值,包括任何对象或字符串" false",都转换为true
。
此外,在QML中,您可以使用Qt Labs Settings QML Type而不是QSettings的包装