Qt Communication between QML and C++ Call C++ in QML


Register C++ classes in QML

At C++ side, imagine we have a class named QmlCppBridge, it implements a method called printHello().

class QmlCppBridge : public QObject
    Q_INVOKABLE static void printHello() {
        qDebug() << "Hello, QML!";

We want to use it in QML side. We should register the class by calling qmlRegisterType():

// Register C++ class as a QML module, 1 & 0 are the major and minor version of the QML module
qmlRegisterType<QmlCppBridge>("QmlCppBridge", 1, 0, "QmlCppBridge");

In QML, use following code to call it:

import QmlCppBridge 1.0    // Import this module, so we can use it in our QML script

QmlCppBridge {
    id: bridge

Using QQmlContext to inject C++ classes or variables to QML

We still use the C++ class in previous example:

QQmlApplicationEngine engine;
QQmlContext *context = engine.rootContext();

// Inject C++ class to QML
context->setContextProperty(QStringLiteral("qmlCppBridge"), new QmlCppBridge(&engine));

// Inject C++ variable to QML
QString demoStr = QStringLiteral("demo");
context->setContextProperty(QStringLiteral("demoStr"), demoStr);

At QML side:

qmlCppBridge.printHello();    // Call to C++ function
str: demoStr                  // Fetch value of C++ variable

Note: This example is based on Qt 5.7. Not sure if it fits earlier Qt versions.