【发布时间】:2015-08-13 19:12:45
【问题描述】:
我有一个QObject 属性声明为:
Q_PROPERTY( QList< int > keys READ getKeys NOTIFY keysChanged )
在docs 中声明:
某些 C++ 序列类型在 QML 中被透明地支持为 JavaScript 数组类型。
具体来说,QML 目前支持:
- QList
...
但是,当我使用此属性驱动 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 数组。是我做错了什么,还是这是一个错误?
【问题讨论】:
-
我知道这根本不能解决问题,但是您是否尝试过使用填充整数的
QVariantList? -
这实际上是一个好点。
QList<int>属性似乎(直接)不适用于Repeater模型,但 JS 数组可以。另一种方法是使用base.proxy.keys.length来控制应该始终有效的模型。我同意你的说法,QList<int>不等同于 JS 数组。 -
您链接到的文档不是关于模型的,它们只是声明这些 C++ 类型“在 QML 中作为 JavaScript 数组类型被透明地支持”。 This 文档是,并且没有将
QList<int>列为有效模型。 -
@Mitch 啊,好点子,感谢您提交错误报告。尽管您链接到的页面不应该也指定
QVariantList可以用作QML 模型吗?因为这对我有用。
标签: javascript c++ qt qml