您应该实现一个仅在导入时可见的单例。这是向 QML 公开核心逻辑的最佳且最有效的解决方案,因为不涉及树查找,并且仅在您选择导入它的位置可见。
qmlRegisterSingletonType<CtxProp>("Sys", 1, 0, "Core", getCoreFoo);
// and in QML
import Sys 1.0
...
doStuffWith(Core.text)
getCoreFoo
是返回一个函数的名称CtxProp *
值(任何QObject *
由于元数据的使用,实际上会这样做)。您可以在函数中创建它,或者只是返回指向现有实例的指针。有些人声称,如果该函数不创建它,可能会出现问题,因为它可能是由 QML 引擎管理的,但是我一直在使用一个预先存在的函数,我在多个 QML 引擎之间共享该函数,并且还没有问题在于,当然明确地将所有权设置为 C++,因为 QML不能真正被信任 https://stackoverflow.com/questions/33792876/qml-garbage-collection-deletes-objects-still-in-use在更动态的使用上下文中管理对象的生命周期。
// main.cpp
static Core * c;
static QObject * getCore(QQmlEngine *, QJSEngine *) { return c; }
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
c = new Core; // create
engine.setObjectOwnership(c, QQmlEngine::CppOwnership); // don't manage
qmlRegisterSingletonType<Core>("Sys", 1, 0, "Core", getCore); // reg singleton
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); // load main qml
return app.exec();
}