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

cma*_*t85 5 javascript c++ qt qml

我有一个QObject财产声明为:

\n\n
Q_PROPERTY( QList< int > keys READ getKeys NOTIFY keysChanged )\n
Run Code Online (Sandbox Code Playgroud)\n\n

文档中指出:

\n\n
\n

QML 中以 JavaScript 数组类型的形式透明地支持某些 C++ 序列类型。

\n\n

特别是,QML 目前支持:

\n\n
    \n
  • QList<int>
  • \n
\n\n

...

\n
\n\n

但是,当我使用此属性来驱动Repeater模型时:

\n\n
QtObject {\n    id: d_\n    property var keys: base.proxy.keys // A binding to the C++ keys property\n    onKeysChanged: {\n        ...\n    }\n}\n\nColumn {\n    spacing: 4\n\n    Repeater {\n        id: repeater\n        model: d_.keys\n        delegate: Rectangle {\n            height: 24\n            width: 24\n            color: "red"\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Repeater模型不产生代表。如果我查询 的长度d_.keys,它会显示正确的数量,如果我从 C++ 更改属性,d_.onKeyChanged:{}则会触发 \xe2\x80\x94 但Repeater永远不会构建任何内容。

\n\n

如果我将 QMLkeys属性更改为 JS 数组:

\n\n
property var keys: [1,2,3]\n
Run Code Online (Sandbox Code Playgroud)\n\n

效果Repeater如预期。如果我使用 C++ 属性,但手动将数据转换为 JS 数组,它也会按预期工作:

\n\n
QtObject {\n    id: d_\n    property var keys: base.proxy.keys\n\n    onKeysChanged: {\n        var list = [];\n        for ( var i = 0; i < keys.length; ++i ) {\n            list.push( keys[i] );\n        }\n        repeater.model = list;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

sky*_*ack 5

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

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