【发布时间】:2014-12-13 04:33:43
【问题描述】:
我围绕 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 将布尔值加载到 QVariant 作为 QString 类型为“true”或“false”(这很好)。问题是当 QML 根据检查属性的需要将其隐式转换为布尔表达式时,它总是转换为 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 将变量字面作为字符串,然后将其转换为布尔值,除非字符串为空白,否则该值始终为真。这是一个错误,还是我做错了什么?
【问题讨论】:
-
任何编程语言规范如何合理地涵盖这一点?对或错?好,还是不好?正确还是不正确?一还是零? 1 还是 0?等等。可能有太多的字符串变体。
-
好点。出于某种原因,我希望 QML 引擎将我的 bool-string 转换为 bool,然后再将其交给 Javascript。但这真的没有意义,而且实际上很模棱两可。