我有一个 QObject 属性声明为:

Q_PROPERTY( QList< int > keys READ getKeys NOTIFY keysChanged )

docs 中指出:



但是,当我使用此属性来驱动 Repeater 模型时:
QtObject {
    id: d_
    property var keys: base.proxy.keys // A binding to the C++ keys property
    onKeysChanged: {
        ...
    }
}

Column {
    spacing: 4

    Repeater {
        id: repeater
        model: d_.keys
        delegate: Rectangle {
            height: 24
            width: 24
            color: "red"
        }
    }
}
Repeater 模型不产生委托(delegate)。如果我查询 d_.keys 的长度,它会显示正确的数量,如果我从 C++ 更改属性,则会触发 d_.onKeyChanged:{} — 但 Repeater 永远不会构建任何东西。

如果我将 QML keys 属性更改为 JS 数组:
property var keys: [1,2,3]
Repeater 按预期工作。如果我使用 C++ 属性,但手动将数据转换为 JS 数组,它也可以按预期工作:
QtObject {
    id: d_
    property var keys: base.proxy.keys

    onKeysChanged: {
        var list = [];
        for ( var i = 0; i < keys.length; ++i ) {
            list.push( keys[i] );
        }
        repeater.model = list;
    }
}

这强烈表明,不管文档怎么说,QList<int> 并不等同于 JS 数组。我做错了什么,还是这是一个错误?

最佳答案

here 所述,QVariantList 被转换为 JS 数组,因此问题可能是内容的类型而不是列表本身。

也就是说,我同意您的观点,因为 QList 似乎也是一个有效的替代方案,所以文档不够清楚。

关于javascript - QList<int> 不能用作 Repeater 的模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31996582/

10-14 09:28