Calling a QML function from C++

23,760

Solution 1

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

Solution 2

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.

Solution 3

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.

Share:
23,760
Mohamed Jihed Jaouadi
Author by

Mohamed Jihed Jaouadi

Updated on December 01, 2021

Comments

  • Mohamed Jihed Jaouadi
    Mohamed Jihed Jaouadi over 2 years

    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;
                ...
            }
    }