Function 如何在qml中创建全局函数

Function 如何在qml中创建全局函数,function,qml,global,Function,Qml,Global,我想创建一个全局函数,它可以在我的其他qml文件中的任何地方调用。我试着把一个函数放在一个矩形中,但它在下一个对象中给了我语法错误。我不想使用singleton,因为语法类似于singleton.foobar。我只想在其他qml的任何地方使用foobar Rectangle { function foobar(v) { return v * 2; } } ApplicationWindow { // syntax error here } 在根节点(Appli

我想创建一个全局函数,它可以在我的其他qml文件中的任何地方调用。我试着把一个函数放在一个矩形中,但它在下一个对象中给了我语法错误。我不想使用singleton,因为语法类似于singleton.foobar。我只想在其他qml的任何地方使用foobar

Rectangle {
    function foobar(v) {
        return v * 2;
    }
}

ApplicationWindow { // syntax error here
}

在根节点(
ApplicationWindow
)中定义函数。 这将是QML在求助于
C++
-上下文属性之前查找名称的最后一个位置

请参阅以了解如何在QML中解析变量和函数的名称

但是,这是不可能的,因此真正的全局JS函数是不可能的

但是,更有效的方法是,将其始终保持在最特定的作用域之一,因此使用
identifier.function()
引用它会更快地查找。然而,图书馆的单件化并不是一条出路。查找JS库的用法

  • 创建具有可调用功能的C++类:
  • 在全局空间中创建MyCPPObject对象(规则如下:它必须存在,直到引擎存在为止(这是一些简化,但已经足够了))
  • 使用以下代码将其导出到qml和js:
  • 引擎存在时,wrapobj也必须存在(再次简化) 4.在qml和JS中:

    ...
    if(cppFun(127, "abc"))
        console.log("It works!");
    ...
    

    注意:我在qml空间和cpp空间中使用了不同的名称,只是为了说明从js中使用cpp函数时可以重命名它,但您当然可以使用相同的名称。

    Upposted,但“对于库来说,单例并不是一条路要走”。“难道不是另一种方法吗?”BaBaRoZoo:你在说“如果你使用一个PrimMar库脚本来存储应用程序实例数据,那么就考虑使用QObjultSnutLon类型。这将导致更好的性能,并且将导致更少的JavaScript堆内存被使用。”IMHO这是关于全局数据的,应该使用适当的类型存储在
    单例中。但如果是关于图书馆,我认为图书馆是正确的方式。为什么不呢?好吧,我完全同意你的看法。只有我才应该坚持正确的命名法。:)GJ!
    
    ...
    MyCPPObject cppobj;
    ...
    
    ...
    QJSValue wrapobj = engine.newQObject(&cppobj);
    engine.globalObject().setProperty("cppFun", wrapobj.property("funToCallFromJS"));
    ...
    
    ...
    if(cppFun(127, "abc"))
        console.log("It works!");
    ...