Search code examples
c++qtqt-quick

How to get valid class instance after doing a qmlRegisterType?


I am using Qt 5.7 on ios & android. I use call to qmlRegisterType to instantiate MyClass derived from QQuickItem view.

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<MyClass>("MyClass", 1, 0, "MyClass");
    QQmlApplicationEngine engine;
    QQmlContext* ctx = engine.rootContext();
    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
    return app.exec();
}

How can I get a valid object of MyClass back from qml ?


Solution

  • You can get access to the tree of objects instantiated by the QML code through the engine's root object(s), see QQmlApplication::rootObjects()

    You can then traverse the QObject tree to find the object(s) you are looking for.

    However, accessing objects instantiated in QML on the C++ side is very often just a hack for something that can be done in a better way.

    The general rule of thumb is to avoid C++ code depending on QML code, i.e. avoid making the rather static C++ side depend on the way more dynamic QML side.

    Prefer letting the C++ side provide data and functionality and letting the QML side consume that data and trigger/call the C++ functions.