将Javascript回调传递给C++;Qml中调用的方法 C++中,我有一个具有可调用函数的类,我想从QML/JavaScript(我已经工作)调用这个方法,并传递一个JavaScript回调。p>
在代码中,我将类定义为:将Javascript回调传递给C++;Qml中调用的方法 C++中,我有一个具有可调用函数的类,我想从QML/JavaScript(我已经工作)调用这个方法,并传递一个JavaScript回调。p>,javascript,qt,qml,qtquick2,Javascript,Qt,Qml,Qtquick2,在代码中,我将类定义为: class MyObject: public QObject { Q_OBJECT public: Q_INVOKABLE void doSomething(quint64 x, /* what goes here? */ jsCallback) { x += 1; // I suspect this will require a invocation mechanism but // this s
class MyObject: public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void doSomething(quint64 x, /* what goes here? */ jsCallback)
{
x += 1;
// I suspect this will require a invocation mechanism but
// this shows what I'd like to do
jsCallback(x);
}
};
在我的QML中,我想做如下事情:
Rectangle {
function myCallback(x){
console.log("x=" + x);
}
MouseArea{
anchors.fill: parent
onClicked:{
myObject.doSomething(2, myCallback);
}
}
}
因此,当我单击矩形时,我会在控制台中看到x=3
。如何定义C++中的参数,调用回调函数来实现这个?
谢谢大家! 我想我已经弄明白了。我最后做的是在我的C++类中实现这类:
class MyObject: public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void doSomething(quint64 x, QJSValue jsCallback)
{
x += 1;
QJSValue val = jsCallback.engine()->newObject();
val.setProperty("x", x);
jsCallback.call(QJSValueList { val });
}
};
然后我可以访问回调中的值,如:
function myCallback(x){
console.log("x=" + x.x);
}
另外,如果在函数内部使用lambda函数(例如,在网络回复之后),请将QJSValue作为可变\按值传递。有人能澄清这是否是一种良好的做法吗?我面临着一个类似的问题,我想将一个项推送到StackView上,但只有在异步操作(从QML调用,用C++实现)完成之后,QJSValue::engine()
现在已被弃用,但在Qt文档中没有建议的替换。我很高兴能有一个最新的答案来解释这一点。