2015-07-24 15 views
10

W C++ mam klasę z funkcją do sprawdzenia, co chciałbym zrobić, to wywołać tę metodę z QML/Javascript (to dostałem do pracy) i przekazać to wywołanie zwrotne JavaScript.Przekazywanie wywołania zwrotnego JavaScript do metody C++ Inwokowane w Qml

W kodzie, określam moją klasę jak:

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); 
    } 
}; 

I w moim QML, chciałbym zrobić coś takiego:

Rectangle { 

    function myCallback(x){ 
     console.log("x=" + x); 
    } 

    MouseArea{ 
     anchors.fill: parent 
     onClicked:{ 
      myObject.doSomething(2, myCallback); 
     } 
    } 
} 

Tak, że po kliknięciu na Rectangle, ja w konsoli zobaczyłby x=3. Jak zdefiniować parametr w C++ i wywołać wywołanie zwrotne, aby to osiągnąć?

Dziękujemy!

Odpowiedz

13

Myślę, że to wymyśliłem. Co skończyło się robi było wdrożenie w moim C++ klasa jak takie:

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 }); 
    } 
}; 

A potem mogę uzyskać dostęp do wartości w moim zwrotnego jak:

function myCallback(x){ 
    console.log("x=" + x.x); 
} 
+0

Również w przypadku korzystania z funkcji lambda wewnątrz funkcji (na przykład, po odpowiedzi sieciowej), przekazuj wartość QJSValue jako zmienną \ według wartości. – Alexander

Powiązane problemy