user3053231
user3053231

Reputation:

Accesing QML element from C++ code in QT

I am trying to use QML with C++ in QT, but for now unsuccessfully. I cannot access my QML element from the C++ code using rootObjects() function. What am I doing wrong?

qml part:

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.2

ApplicationWindow {
    id: window
    visible: true
    width: 640
    height: 520
    title: qsTr("My app")

    Item {
        anchors.fill: parent
        Rectangle {
            id: rectangle1
            x: 0
            y: 0
            width: 640
            height: 370
            color: "#ffffff"
            }


        Button {
            id: startButton
            x: 325
            y: 425
            text: qsTr("Start")
        }
    }
}

C++ Part:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    QObject *rootObject = engine.rootObjects().first();
    qDebug() << rootObject->objectName();//prints ""


    QObject *qmlObject = rootObject->findChild<QObject*>("window");// or "startButton"
    //qDebug() << qmlObject->objectName(); //app fails, because window was not found


    QList<QObject *> allQObjects = rootObject->findChildren<QObject *>();
    for(int i=0;i< allQObjects.length();++i)
    {
        qDebug() << allQObjects[i]->objectName(); //prints everytime ""
    }
    qDebug() << "len: " << allPQObjects.length(); //prints 132


    return app.exec();
}

Upvotes: 0

Views: 544

Answers (2)

Kombinator
Kombinator

Reputation: 105

At first: If you do not set a object name there will be no!

QML:

Rectangle { id : frame; objectName : "objFrame"  color : "blue" } 

Qt:

 QObject *pRootObject = m_pQmlView->rootObject();  
 QObject  *pobjFrame  = m_pRootObject->findChild<QObject *>("objFrame"); 

The other way arround:

Qt: m_pQmlView->rootContext()->setContextProperty( "_view", this );

QML:

 Component.onCompleted: {

    /**********************  Connections  ***************************/

    // connect signal MyView::retranslate() with slot retranslate        
     _view.retranslate.connect(retranslate)
}

Upvotes: 1

user3053231
user3053231

Reputation:

Need to add objectname to QML

ApplicationWindow {
    id: window
    objectName: "window"
    ...
}

Upvotes: 0

Related Questions