I'm developing a Blackberry 10 mobile application using the BB Native SDK.
I need to call a QML function into my C++ class. I searched a lot on this but I only found the possibility to call C++ into QML not the inverse. You can check this: QML and C++ integration
Can anyone help me on this?
This is the QML code specifying the function that I need to call which add a marker into my mapview:
Container {
id: pinContainer
objectName: "pinContObject"
...
function addPin(lat, lon, name, address) {
var marker = pin.createObject();
marker.lat = lat;
marker.lon = lon;
...
}
}
Thats what signals and slots are for.
You can use the QML Connections for connecting arbitrary signals to arbitrary slots in 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)
}
}
}
and in C++ backend, all you have to do is
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");
}
}
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;
This should works. Here i am calling a QML function from my C++ class.
From Qt documentation:
http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#invoking-qml-methods
Calling QMetaObject::invokeMethod
one will call proper slot, no matter if it is defined in C++ or QML.