无法设置 QQmlApplicationEngine rootContext 属性

Unable to set QQmlApplicationEngine rootContext Property

我有以下代码,我认为应该使“后端”C++ 对象在我的 GUI 的 QML 元素中可用,但似乎失败了,导致我的 QML 对象 属性为空。

    //Initialize the engine, register the Data_Client object and set the "client" property
    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    const QUrl url(QStringLiteral("qrc:/qml/gui.qml"));

    qmlRegisterType<Data_Client>("uri", 1, 0, "Data_Client");
    qmlRegisterType<StatusObject>("uri", 1, 0, "StatusObject");

    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    Data_Client client();
    //Make the Data_Client accessible in the engine root context so its available to all component instances
    context->setContextProperty("client", &client); 
    return app.exec();

在gui.qml文件的ApplicationWindow项中,声明了client属性,声明了以“客户端”为目标的各种连接:

property Data_Client client
//...
Connections {
        target: client
        onNew_data:{ 
        //...
        }

Data_Client C++ 中,我调用 emit new_data(QString("test")); 但从未触发 QML 中的处理程序。这以前是有效的,我认为从根本上来说很简单,所以我很高兴去,所以我还没有确定我可能坏了什么。我现在的操作理论是,这不是设置 rootContext 的 client 属性,但是我无法在运行时进行检查,是吗?有什么明显的我遗漏的吗?

理论上,setContextProperty 可以在任何时候调用,但是此时已经加载的任何 QML 文件可能都看不到那个新的 属性。在该点之后加载的 QML 文件将会看到它。因此,在调用 engine.load() 之前调用 setContextProperty 应该可以为您解决问题。