2013-11-15 3 views
5

Я разрабатываю мобильное приложение Blackberry 10 с использованием собственного SDK для BB.Вызов функции QML из C++

Мне нужно вызвать функцию QML в мой класс C++. Я много искал в этом, но я только нашел возможность вызывать 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 function/variable scoping применяются, если есть какие-либо конфликты пространства имен переменных с параметрами функции сигналов. Удачи :) – 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; 

Это должно сработать. Здесь я вызываю функцию QML из моего класса C++.

+0

Это точно код, который можно найти в документации Qt: [http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#invoking-qml-methods]] –

+0

Документация Qt хороша достаточно, но люди не успевают их прочитать. Им нужна конкретная информация, которую я предоставил. – SourabhKus

Смежные вопросы