将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文档中没有建议的替换。我很高兴能有一个最新的答案来解释这一点。