【问题标题】:QML engine not implicitly converting a bool-string QVarient to bool propertyQML 引擎不会将布尔字符串 QVarient 隐式转换为布尔属性
【发布时间】: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。但这真的没有意义,而且实际上很模棱两可。

标签: c++ qt qml qt-quick


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2015-02-23
    • 2012-12-16
    相关资源
    最近更新 更多