c++ - QML 引擎没有隐式地将 bool-string QVarient 转换为 bool 属性

标签 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 将 bool 值作为 QString 类型加载到 QVariant 中,作为“true”或“false”(这很好)。问题是,当 QML 根据检查的属性的需要将其隐式转换为 bool 表达式时,它总是转换为 true(即使它实际上是“false”)。我找到了一个变通方法来检测 Settings::value() 中的 QVariant 实际上是 bool 值。

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 值,除非字符串为空,否则该值始终为真。这是一个错误,还是我做错了什么?

最佳答案

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

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

关于c++ - QML 引擎没有隐式地将 bool-string QVarient 转换为 bool 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27455575/

相关文章:

qt - QML 在匿名孙子之间发送信号

qt - QSignalSpy 捕获引用参数

qt - 如何使用video 5.12 qt qml播放视频?

arrays - 如何动态地将值推送到 QML 属性变体二维数组?

c++ - 在Qt中实现退出按钮

listview - QML:防止 ListView 在模型更改开始时返回

c++ - 这些 OpenGL 函数末尾需要 "3f"吗?

c++ - 替换 WNDCLASS 中的画笔颜色

java - SWIG C++ 结构到 java

c++ - 为什么一般程序一般都是从0x8000开始?