如何在qml中创建全局函数

时间:2017-05-18 09:36:39

标签: function qml global

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

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

ApplicationWindow { // syntax error here
}

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

  1. 使用可调用函数创建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函数时可以重命名,但是您当然可以使用相同的名称。