我有QML代码,例如此代码
Item {
id:self;
function update(){
var visitFunc = self.applyUpdate;
innerTraversal(self,visitFunc);
}
function reset(){
var visitFunc = self.applyReset;
innerTraversal(self,visitFunc);
}
function innerTraversal(obj, visitFun){
console.log(typeof visitFun);
if(obj!== self && visitFun && typeof visitFun ==="function")
visitFun(obj);
if(hasChilderns(obj)){
var objChilderns = obj.children;
for(var i=0 ; i< objChilderns.length ; i++){
innerTraversal(objChilderns[i]);
}
}
}
function hasChilderns(obj){
if(typeof obj.children !== 'undefined')
return true;
else
return false;
}
function applyReset(obj){
if(typeof obj.reset === 'function')
obj.reset();
}
function applyUpdate(obj){
if(typeof obj.update === 'function')
obj.update();
}
}
在普通的javascript中这很酷,但是当我在QML中使用这个代码时,访问函数总是有未定义的类型,而且它不起作用。
任何想法如何使这项工作?
答案 0 :(得分:2)
在QtQuick 2中,您应该能够使用
将函数绑定到属性Item { //<-- declaration
id : item
property variant fun
}
item.fun : Qt.binding(function(){doSomething()}) //<--defintion
item.fun // <-- invocation without braces
所以你可以传递一个带有泛型函数的对象作为参数。
通常,函数重载a也可用于创建泛型函数,例如创建Button类型:
---Button.qml
Item {
function fun() {} //<-- declaration (empty dummy)
MouseArea {
anchors.fill: parent
onClicked: {
fun(); //<-- invocation
}
}
}
---
---main.qml---
Button {
id: button
function fun() { //<-- defintion by overloading
doSomething
}
}
---
单击该按钮将激活其onClick处理程序并实际执行某些操作;)。然后,您将使用泛型函数而不是函数本身传递对象。
答案 1 :(得分:1)
在QML内部,你的“self”的类型为“QQuickItem”,而普通的JS对象(例如用“new Object()”或“{”prop“:”value“}”创建)的类型为QJsValue。并且“self”不是变量名,它是QML id,请记住该defference。
在QML中,使用signal \ slots或属性绑定可以更强大,而不是像“普通”JS那样传递回调。使用“typeof”也是不好的做法(就我所说的“正常”JS而言),你可以简单地写出类似的东西:
// Or simply "return obj.children" - but function become useless than.
if(obj.children)
return true;
else
return false;
但是这段代码仍然没用--QML中Item的属性“children”有“list”类型,它总是存在。
所以我的结论 - 在写东西之前,你应该尝试学习一些QML基础知识。