2015-07-24 16 views
10

Trong C++ Tôi có một lớp với hàm không thể invoke, điều tôi muốn làm là gọi phương thức đó từ QML/Javascript (điều này tôi đã làm việc) và vượt qua nó là một cuộc gọi lại Javascript.Chuyển một cuộc gọi lại Javascript tới phương thức gọi C++ trong Qml

Trong mã, tôi xác định lớp học của tôi như:

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

Và trong QML của tôi, tôi muốn làm một cái gì đó như:

Rectangle { 

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

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

Vì vậy mà khi tôi bấm vào Rectangle, tôi sẽ thấy x=3 trong bảng điều khiển. Làm thế nào tôi sẽ xác định các tham số trong C + + và gọi gọi lại để thực hiện điều này?

Cảm ơn bạn!

Trả lời

13

Tôi nghĩ rằng tôi đã tìm ra điều này. Những gì tôi đã kết thúc làm là thực hiện điều này trong C của tôi ++ lớp như ví dụ:

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

Và sau đó tôi có thể truy cập các giá trị trong callback của tôi như:

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

Ngoài ra nếu bạn sử dụng chức năng lambda bên trong function (ví dụ, sau khi trả lời mạng), chuyển QJSValue thành giá trị có thể thay đổi \. – Alexander

Các vấn đề liên quan