We want to create a label in QML and change its text occasionally. In order to expose the label object to C++, we can do the following steps. First, create a C++ class called MyLabel
that extends from QObject
class:
In the mylabel.cpp
source file, define a function called SetMyObject()
to save the object pointer. This function will later be called in QML:
After that, in main.cpp
, include MyLabel
header and register it to QML engine using the function qmlRegisterType()
:
Notice that there are four parameters you need to declare in qmlRegisterType()
. Besides declaring your class name (MyLabel
), you also need to declare your library name (MyLabelLib
) and its version (1.0
), which will be used for importing your class to QML later on.
Now that the QML engine is fully aware of our custom label class, we can then map it to our label object in QML and import the class library we defined earlier by calling import MyLabelLib 1.0
in our QML file. Notice that the library name and its version number have to match with the one you declared in main.cpp
, otherwise it will throw you an error.
After declaring MyLabel
in QML and setting its ID as mylabels
, call mylabel.SetMyObject(myLabel)
to expose its pointer to C/C++ right after the label is being initialized:
Please be aware that you need to wait until the label is fully initiated before exposing its pointer to C/C++, otherwise you may cause the program to crash. To make sure it's fully initiated, call SetMyObject()
within Component.onCompleted
and not any other places.
Now that the QML label has been exposed to C/C++, we can change any of its properties by calling setProperty()
function. For instance, we can set its visibility to true
and change its text to Bye bye world!
:
Besides changing the properties, we can also call its functions by calling QMetaObject::invokeMethod()
:
Or simply, we can call the invokedMethod()
function with only two parameters if we do not expect any values to be returned from it:
QML is designed to be easily extensible through C++ code. The classes in the Qt QML module enable QML objects to be loaded and manipulated from C++, and the nature of the QML engine's integration with Qt's meta object system enables C++ functionality to be invoked directly from QML. To provide some C++ data or functionality to QML, it must be made available from a QObject-derived class.
QML object types can be instantiated from C++ and inspected in order to access their properties, invoke their methods, and receive their signal notifications. This is possible due to the fact that all QML object types are implemented using QObject-derived classes, enabling the QML engine to dynamically load and introspect objects through the Qt meta object system.