0

我目前正在使用 QQmlApplicationEngine 加载我的 main.qml 并且工作正常,然后我想切换到 main2.qml(不调用我的 QQmlApplicationEngine 上的 quit() ,因为这会触发 QCoreApplication::exit() 它将退出我的应用程序)。所以我只是删除我的引擎,创建一个新引擎并再次设置上下文属性(main.qml 的不同上下文属性略有不同),并且加载正常。然后我切换回 main.qml(再次加载 main.qml),我开始收到类似的警告

qrc:/qml/...: Cannot read property of null

该特定属性在 main.qml 的上下文中为空,因此这是正确的,但在 main2.qml 的上下文中它不是空的。但我的问题是为什么我第一次加载 main.qml 时没有收到警告?如果在加载 main2.qml 后加载 main.qml,我似乎只会收到警告。

感谢您的帮助。

编辑:这是一个简单的示例代码

QSharedPointer<QQmlApplicationEngine> m_engine;
QQmlContext* m_ctxt;

void loadEngine(int window){
    m_engine->clearComponentCache();
    m_engine.reset(new QQmlApplicationEngine, &QObject::deleteLater);
    m_ctxt = m_engine->rootContext();

    m_ctxt->setParent(m_engine.get());
    QVector<QQmlContext::PropertyPair> qmlProperties;

    qmlProperties.push_back(QQmlContext::PropertyPair{"object", QVariant::fromValue(object)});

    if(window == 1){
        qmlProperties.push_back(QQmlContext::PropertyPair{"object1", QVariant::fromValue(object1)});
        // add more context properties

        m_ctxt->setContextProperties(qmlProperties);
        m_engine->load(QUrl(QLatin1String("qrc:/qml/main.qml")));
    }
    else{    
        qmlProperties.push_back(QQmlContext::PropertyPair{"object2", QVariant::fromValue(object2)});
        // add more context properties

        m_ctxt->setContextProperties(qmlProperties);
        m_engine->load(QUrl(QLatin1String("qrc:/qml/main2.qml")));
    }
}
4

1 回答 1

1

我想建议您使用 QML Loader 组件来更改当前的可视视图。在此页面上,您可以找到一些如何使用加载器的示例https://doc.qt.io/qt-5/qml-qtquick-loader.html

在这种情况下,您必须为“object1”和“object2”提供上下文属性。

于 2020-05-23T18:05:52.373 回答