QML:如何将javascript函数作为另一个函数中的参数传递

Cre*_*der 5 javascript qt qml

我有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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在普通的javascript中,这很酷,但是当我在QML中使用此代码时,坏的事情是visitFun始终具有未定义的类型,并且不起作用。

任何想法如何使这项工作?

cuf*_*fel 6

在 QtQuick 2 中,您应该能够使用以下方法将函数绑定到属性

Item {  //<-- declaration
  id : item
  property variant fun 
}
item.fun : Qt.binding(function(){doSomething()})  //<--defintion

item.fun // <-- invocation without braces 
Run Code Online (Sandbox Code Playgroud)

所以你可以传递一个带有泛型函数的对象作为参数。

通常,函数重载 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
  }
}
---
Run Code Online (Sandbox Code Playgroud)

单击按钮将激活其 onClick 处理程序并实际执行某些操作;)。同样,然后您将使用泛型函数而不是函数本身传递对象。


QtR*_*RoS 1

在 QML 内部,您的“self”具有“QQuickItem”类型,而普通 JS 对象(例如,使用“new Object()”或“{”prop”:“value”}”创建)具有 QJsValue 类型。“self”不是变量名,而是 QML id,请记住这种差异。

在 QML 中,使用信号\槽或属性绑定比在“普通”JS 中传递回调要强大得多。使用“typeof”也是不好的做法(据我所知,在“普通”JS 中也是如此),你可以简单地编写如下内容:

// Or simply "return obj.children" - but function become useless than.
if(obj.children)
        return true;
    else
        return false;
Run Code Online (Sandbox Code Playgroud)

但这段代码仍然没用 - QML 中 Item 的属性“children”具有类型“list”,它始终存在。

所以我的结论是——在写东西之前你应该尝试学习一些 QML 基础知识。