我想创建一个可以在我的其他qml文件中的任何位置调用的全局函数。尝试将函数放在矩形内部,但它在下一个对象中给出了语法错误。我不想使用单例,因为语法就像Singleton.foobar。我只想在其他qml的任何地方使用foobar。
Rectangle {
function foobar(v) {
return v * 2;
}
}
ApplicationWindow { // syntax error here
}
答案 0 :(得分:4)
在根节点(ApplicationWindow
)中定义函数。
这将是最后一个地方,QML将在它转向C++
- 上下文属性之前寻找名称。
请参阅here以了解如何在QML中解析变量和函数的名称。
然而modify the global object不可能,所以真正的全局JS函数是不可能的。
然而,更有效的方法是将其保持在一个特定的范围内,因此使用Identifyer.function()
引用它会更快查找。然而,图书馆的单身人士不是必须走的路。查看here以了解JS库的用法。
答案 1 :(得分:0)
...
class MyCPPObject : public QObject
{
Q_OBJECT
public:
...
Q_INVOKABLE bool funToCallFromJS(int any, QString args);
...
...
MyCPPObject cppobj;
...
...
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函数时可以重命名,但是您当然可以使用相同的名称。