2013-11-15 60 views
5

BB Native SDKを使用してBlackberry 10モバイルアプリケーションを開発しています。C++からQML関数を呼び出す

私のC++クラスにQML関数を呼び出す必要があります。私はこれについて多くのことを探しましたが、私はC++を逆ではなくQMLに呼び出す可能性を発見しました。あなたはこれを確認することができます:QML and C++ integration

誰も私にこれを助けることができますか?

これは私が私のMapViewにマーカーを追加どの呼び出す必要がある関数を指定QMLコードです:

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関数/変数スコープの規則は、変数とシグナルの関数paramsとの名前空間の衝突がある場合に適用されます。幸運:) – 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関数を呼び出しています。 Qtのドキュメントから

+0

これはQtのドキュメントにあるコードとまったく同じです: [http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#invoking-qml-methods]] –

+0

Qtのドキュメントは良いです十分なのですが、人々はそれらを読む時間がありません。彼らは私が提供した特定の情報をすばやく必要とします。 – SourabhKus

関連する問題