See Loading QML objects from C ++ :
QQuickView view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();
QQuickItem *root = view.rootObject()
QQmlComponent component(view.engine(), QUrl("qrc:/Button.qml"));
QQuickItem *object = qobject_cast<QQuickItem*>(component.create());
You have now created an instance of the custom component Button.
To avoid javascript garbage collection in order to kill it, tell QML that C ++ will take care of this:
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
You need 2 parents: a visual parent to show the object and a QObject parent to objectbe deleted correctly when viewdeleted.
object->setParentItem(root);
object->setParent(&view);
It is not possible to set any property in object, as in QML. To make sure QML is aware of the change, use the following function:
object->setProperty("color", QVariant(QColor(255, 255, 255)));
object->setProperty("text", QVariant(QString("foo")));
Done.
Alternative version of QQmlEngine :
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QQuickWindow *window = qobject_cast<QQuickWindow*>(engine.rootObjects().at(0));
if (!window) {
qFatal("Error: Your root item has to be a window.");
return -1;
}
window->show();
QQuickItem *root = window->contentItem();
QQmlComponent component(&engine, QUrl("qrc:/Button.qml"));
QQuickItem *object = qobject_cast<QQuickItem*>(component.create());
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
object->setParentItem(root);
object->setParent(&engine);
object->setProperty("color", QVariant(QColor(255, 255, 255)));
object->setProperty("text", QVariant(QString("foo")));