2013-11-15 18 views
5

Ich entwickle eine Blackberry 10 mobile Anwendung mit dem BB Native SDK.Aufruf einer QML-Funktion von C++

Ich muss eine QML-Funktion in meine C++ - Klasse aufrufen. Ich habe viel darüber gesucht, aber ich habe nur die Möglichkeit gefunden, C++ in QML umzubenennen, nicht umgekehrt. Sie können dies überprüfen: QML and C++ integration

Kann mir jemand dabei helfen?

Dies ist der QML-Code Angabe der Funktion, die ich anrufen müssen, welche einen Marker in mein mapview hinzufügen:

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

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

Antwort

6

Das ist, was Signale und Slots für sind. Sie können die QML-Verbindungen zum Verbinden beliebiger Signale mit beliebigen Slots in QML verwenden.

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

und in C++ Backend, alles, was Sie tun müssen, ist

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

Wirklich gut für Ihre Antwort !!! aber, wie man Parameter in C++ übergibt und es zu den qml Funktionsparametern beeinflußt? –

+0

Das Beispiel wurde aktualisiert, um Funktionsparameter über zu übergeben. Signale. Die JavaScript-Funktion/Variablen-Scoping-Regeln gelten, wenn Namespace-Kollisionen der Variablen mit den Funktionsparametern der Signale auftreten. Viel Glück :) – Dinesh

+0

Thx^_^!! Aber leider, wenn ich versuche, die Anwendung in meinem BB-Gerät zu starten, will es nicht laden; Ich habe überprüft und festgestellt, dass ein Problem beim Hinzufügen der ** Verbindungseigenschaft ** in der QML-Datei vorliegt. Ich bin wirklich verwirrt:/ –

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; 

Dies sollte funktionieren. Hier rufe ich eine QML-Funktion von meiner C++ - Klasse auf.

+0

Dies ist genau der Code, der in Qt's Dokumentation gefunden werden kann: [http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlromcpp.html#invoking-qml-methods]] –

+0

Qt Dokumentation ist gut genug, aber die Leute haben keine Zeit, sie zu lesen. Sie benötigen bestimmte Informationen schnell, die ich zur Verfügung gestellt habe. – SourabhKus