如何在执行 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++ 函数。
我在 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++ 函数。