2013-11-15 52 views
5

我正在使用BB Native SDK開發Blackberry 10移動應用程序。從C++調用QML函數

我需要在我的C++類中調用QML函數。我在這方面進行了很多搜索,但是我只是發現將C++調用到QML中的可能性並非相反。你可以檢查:QML and C++ integration

任何人都可以幫助我嗎?

這是QML代碼指定我需要調用它添加標記到我的MapView功能:

Container { 
    id: pinContainer 
    objectName: "pinContObject" 
     ... 

     function addPin(lat, lon, name, address) { 
      var marker = pin.createObject(); 
      marker.lat = lat; 
      marker.lon = lon; 
      ... 
     } 
} 

回答

6

那是什麼信號和槽是。 您可以使用QML連接將任意信號連接到QML中的任意插槽。

http://qt-project.org/doc/qt-4.8/qml-connections.html

Container { 
      id: pinContainer 
      objectName: "pinContObject" 
      ... 

      function addPin(lat, lon, name, address) { 
       var marker = pin.createObject(); 
       marker.lat = lat; 
       marker.lon = lon; 
       ... 
      } 

      Connections { 
       target: backend 
       onDoAddPin: { 
        addPin(latitude, longitude,name, address) 
       } 
      } 
    } 

和C++後端,所有你需要做的就是

class Backend: public QObject { 
signals: 
    void doAddPin(float latitude, float longitude, QString name, QString address); 

........ 
void callAddPinInQML(){ 
    emit doAddPin(12.34, 45.67, "hello", "world"); 
} 
} 
+0

真的很適合你的答案!但如何在C++中傳遞參數並將其影響到qml函數參數? –

+0

更新了示例以通過函數參數傳遞。信號。如果變量與信號的函數參數之間存在任何名稱空間衝突,則應用JavaScript函數/變量範圍規則。祝你好運:) – Dinesh

+0

Thx^_^!!但不幸的是,當我嘗試在我的BB設備中運行應用程序時,它不想加載;我檢查並發現在QML文件中添加**連接屬性**時出現問題。我很困惑:/ –

5

MyItem.qml

import QtQuick 2.0 
    Item { 
    function myQmlFunction(msg) { 
     console.log("Got message:", msg) 
     return "some return value" 
    } 
} 

的main.cpp

QQmlEngine engine; 
QQmlComponent component(&engine, "MyItem.qml"); 
QObject *object = component.create(); 

QVariant returnedValue; 
QVariant msg = "Hello from C++"; 
QMetaObject::invokeMethod(object, "myQmlFunction", 
    Q_RETURN_ARG(QVariant, returnedValue), 
    Q_ARG(QVariant, msg)); 

qDebug() << "QML function returned:" << returnedValue.toString(); 
delete object; 

這應該起作用。在這裏,我從我的C++類調用QML函數。

+0

這就是在Qt的文檔中可以找到的代碼: [http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#invoking-qml-methods]] –

+0

Qt的文檔很好足夠,但人們沒有時間閱讀。他們需要我提供的特定信息。 – SourabhKus