c++qtqmlqt5qqmlcomponent

Is it possible to create a Qml Component from C++?


Is there some way to create/append a QML Component from C++?

Example, if i have this QML:

Window {
    id: window
    objectName: "windowName"
    title: "windowName"
    width: 480
    height: 800

    Rectangle {
        id: frmHeader
        objectName: "frmHeader"
        width: parent.width
        height: parent.height
    }
}

Is it possible append a TextInput on Rectangle?


Solution

  • In your case you should follow the following steps:

    main.cpp

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QQmlComponent>
    #include <QQmlProperty>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        QObject *frmHeader = engine.rootObjects().first()->findChild<QObject *>("frmHeader");
        QQmlComponent component(&engine);
        component.setData("import QtQuick 2.7 \n"
                          "TextInput{ \n"
                          "text: \"hello world :D\" \n"
                          "}", QUrl());
        QObject *text_object = component.create();
        if(text_object && frmHeader)
            Q_ASSERT(QQmlProperty::write(text_object,
                                         "parent",
                                         QVariant::fromValue(frmHeader)));
    
        return app.exec();
    }