Qt World Summit: Register Today!

Adding a new component definition in a class method to the scene

  • Hi,

    there's a class woman. It is registered in QML system.
    main.qml contains the object definition with a signal handler.
    The handler calls c++ method which should add a new button into the scene.

    I need to find the root object - the window in the main.qml to become a parent for the new button.
    How do you find a root object?

    Here's the method:
    extern QQuickWindow *window;
    void woman::add_hip()
    setProperty("hip", 87);

    QQmlEngine *engine = QtQml::qmlEngine(this);
    // 1. Define a QML component.
    QQmlComponent *readHipComp = new QQmlComponent(engine);
    readHipComp->setData("import QtQuick.Controls 1.2\n\
                         Button {\n\
                             anchors.top: addHipBtn.top\n\
                             anchors.left: addHipBtn.left\n\
                             anchors.margins: 3\n\
                             text: \"Hip value\"\n\
                             onClicked: {\n\
                                 msgDlg.text = woman.hip\n\
                         }", QUrl());
    // 2. Create the component instance.
    QQuickItem *readHipBtn = qobject_cast<QQuickItem *>(readHipComp->create());
    // 3. Add the instance to the scene.
    readHipBtn->setParentItem(qobject_cast<QQuickItem *>(engine->rootContext()->contextObject()));


    <Unknown File>: ReferenceError: addHipBtn is not defined
    <Unknown File>: ReferenceError: addHipBtn is not defined.

    It is added to GUI but it does not see other main.qml objects.

  • Moderators


    If I'm not mistaken you can pass the engine object to the class and then find the root object there.
    Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    QQmlApplicationEngine engine;
    QObject *rootObject= engine.rootObjects().first();
    //rootObject will point to Window

    In your case you can either pass rootObject to your class or pass engine to the class so that you can find root element there.

Log in to reply