【发布时间】:2015-03-06 12:11:53
【问题描述】:
我认为 QML 支持 lambda 函数是因为 JavaScript 支持匿名函数以及函数是一流对象的事实,但它们并没有按我的预期工作。拿这个代码:
Item {
property var items: []
function handler( item ) {
console.log( item );
}
Component.onCompleted: {
for ( var i = 0; i < 3; ++i ) {
var item = someObj.createObject();
item.someValueChanged.connect( function() {
handler( item ); } );
items.push( item );
console.log( "Adding:", item );
}
}
Component {
id: someObj
Item {
property bool someValue: false
Timer {
running: true
onTriggered: {
parent.someValue = true;
}
}
}
}
}
我正在尝试使用 lambda function() { handler( item ); },以便在发出 someObj::someValueChanged 信号时,将发射项目传递给 handler( item ) 函数。
我假设每个循环都会创建一个新的 lambda 实例,并且 item 引用将携带在该循环中创建的 someObj 实例的引用(即 item 将被 lambda 捕获)。但情况似乎并非如此,因为输出是:
qml: Adding: QQuickItem_QML_1(0x2442aa0)
qml: Adding: QQuickItem_QML_1(0x2443c00)
qml: Adding: QQuickItem_QML_1(0x2445370)
qml: QQuickItem_QML_1(0x2445370)
qml: QQuickItem_QML_1(0x2445370)
qml: QQuickItem_QML_1(0x2445370)
如您所见,要么在每个循环中替换整个函数,要么只替换 item 引用,因此最终只引用最后创建的 someObj。有人可以向我解释为什么 lambdas(如果它就是这样的话)不能按我期望的方式工作吗?这是 QML 问题,还是一般的 JavaScript 问题?
【问题讨论】:
标签: javascript qt lambda qml