QList <int>不能用作Repeater的模型

时间:2015-08-13 19:12:46

标签: javascript c++ qt qml

我将QObject属性声明为:

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

docs中声明:

  

在QML中透明地支持某些C ++序列类型   JavaScript数组类型。

     

特别是,QML目前支持:

     
      
  • 的QList&LT; int&gt;
  •   
     

...

但是,当我使用此属性来驱动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模型不产生任何代表。如果我查询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数组。我做错了什么,或者这是一个错误?

1 个答案:

答案 0 :(得分:3)

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

那就是说,我同意你的意见,文件不够清楚,因为QList似乎也是一个有效的选择。