如何在qml中创建全局函数

问题描述 投票:1回答:2

我想创建一个可以在我的其他qml文件中的任何地方调用的全局函数。尝试将函数放在矩形内部,但它在下一个对象中给出了语法错误。我不想使用单例,因为语法就像Singleton.foobar。我只想在其他qml的任何地方使用foobar。

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

ApplicationWindow { // syntax error here
}
function qml global
2个回答
4
投票

在根节点(ApplicationWindow)中定义函数。这将是最后一个地方,QML将在它转向C++-context属性之前寻找名称。

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

然而,modify the global object是不可能的,所以真正的全局JS函数是不可能的。

然而,更有效的方法是将其保持在一个特定的范围内,因此使用Identifyer.function()引用它会更快查找。然而,图书馆的单身人士不是必须走的路。查看here以了解JS库的用法。


0
投票
  1. 使用invokable函数创建C ++类:
...
class MyCPPObject : public QObject
{
    Q_OBJECT
public:
...
Q_INVOKABLE bool funToCallFromJS(int any, QString args);
...
  1. 在全局空间中创建MyCPPObject对象(规则如下:它必须存在,直到引擎存在(这是一些简化,但足够))
...
MyCPPObject cppobj;
...
  1. 使用以下代码将其导出到qml和js:
...
QJSValue wrapobj = engine.newQObject(&cppobj);
engine.globalObject().setProperty("cppFun", wrapobj.property("funToCallFromJS"));
...

引擎存在时,wrapobj也必须存在(再次简化)4。在qml和JS中:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.