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 函数的参数传递?