如何在执行 qmlRegisterType 后获得有效的 class 实例?

How to get valid class instance after doing a qmlRegisterType?

我在 ios 和 android 上使用 Qt 5.7。我使用对 qmlRegisterType 的调用来实例化从 QQuickItem 视图派生的 MyClass

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();
}

如何从 qml 返回 MyClass 的有效对象?

在您的代码中,您将 MyClass QML 自定义对象注册到 QML 对象库中。这将允许您在您的 QML 文档中实例化您的 QML 组件 MyClass,如下所示:

import MyClass.1.0
Item {

.....
    MyClass{
    }
}

因此注册 QML 对象将使您有可能实例化您的 QML 对象,就像您在示例代码中提到的那样。

因此,如果您愿意,要在您的任何 C++ 类 中从您的 QML "Scene" 访问任何对象,您需要加载对象场景,并爬过它们的子对象。请参阅此文档:

Interacting with QML Objects from C++

而且你应该还好。

还有一件事:我认为从 C++ 读取 QML 对象时最常见的 "first time ever" 需要是读取 属性,所以在 link 中有这个部分:"Accessing Members of a QML Object Type from C++"。从那里开始。

您可以通过引擎的根对象访问 QML 代码实例化的对象树,参见 QQmlApplication::rootObjects()

然后您可以遍历 QObject 树来找到您要查找的对象。

但是,在 C++ 端访问在 QML 中实例化的对象通常只是一种可以用更好的方式完成的事情的 hack。

一般的经验法则是避免 C++ 代码依赖于 QML 代码,即避免使相当静态的 C++ 端依赖于更动态的 QML 端。

更喜欢让 C++ 端提供数据和功能,让 QML 端使用该数据和 trigger/call C++ 函数。