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

Posted

技术标签:

【中文标题】QML:如何将javascript函数作为参数传递给另一个函数【英文标题】:QML : how to pass javascript function as argument in another function 【发布时间】:2015-01-14 14:36:40 【问题描述】:

我有 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 中使用这段代码时,坏事是 visitFun 的类型总是未定义,而且它不起作用..

知道如何进行这项工作吗?

【问题讨论】:

【参考方案1】:

在 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 处理程序并实际执行某些操作 ;)。同样,您将使用通用函数而不是函数本身传递对象。

【讨论】:

【参考方案2】:

在 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;

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

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

【讨论】:

谢谢您的回答,但将函数作为参数传递是 JavaScript 的重要组成部分,我想使用它而不是使用不可移植的信号/插槽,以使用相同的代码概念其他地方。另外,我想继续检查 childern,因为此代码可能会在其他地方或不是项目类型的对象中使用!我写的只是我尝试做的一个示例,但主要是javascript代码将在独立的js文件中。我只需要知道一件事,QML 是否真的支持完整的 javascript 语法或不支持 @CreativeCoder 你找到解决方案了吗?我还想将函数作为参数传递给自定义对话框组件。知道你是如何解决你的案子的会很有趣。提前致谢

以上是关于QML:如何将javascript函数作为参数传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库列值作为 JavaScript 函数的参数传递?

将 Javascript 函数作为参数传递 - 这个逻辑是如何工作的?

将 JavaScript 函数作为参数传递

将 JavaScript 函数作为参数传递

如何将对象属性作为参数传递? (JavaScript)

Javascript - 将函数作为参数传递